ANN: ECL 8.12

Discussion of Common Lisp
Post Reply
jjgarcia
Posts: 38
Joined: Mon Oct 13, 2008 2:48 pm

ANN: ECL 8.12

Post by jjgarcia » Thu Dec 18, 2008 2:17 am

Notes for this release
======================

This release is the last one before a major redesign of ECL, which will affect
issues like Unicode streams and handling of interrupts.

This is also the first one to follow the new numbering scheme, inspired by that
of Ubuntu. The release number follows the scheme year.month.[0-9], where the
last digit marks the patch release. The numbering is now incorporated in the
library names, so that different versions of ECL may coexit on the same system.

ECL 8.12.0:
==========

* Visible changes:

- The compiler now signals compiler-error, compiler-warning and compiler-note
for errors, warnings and notes, respectively.

- Printing of compiler messages is now ruled by *COMPILE-PRINT*, *COMPILE-VERBOSE*
and *SUPPRESS-COMPILER-MESSAGES*. The latter is either NIL or a valid lisp type
which denotes which compiler messages are suppressed. If *SUPPRESS-COMPILER-MESSAGES*
is NIL and *COMPILE-VERBOSE* is NIL, then no messages are shown.

- *SUPPRESS-COMPILER-NOTES* and *SUPPRES-COMPILER-WARNINGS* are deprecated and
will be removed in next release.

- ECL allows the user to set up handlers for different compiler conditions,
including errors, warnings and simple notes. The recommended procedure is to
use HANDLER-BIND and _NOT_ to transfer control out of the compilation
environment, but to defer to the default handlers or use the restarts ABORT
and MUFFLE-WARNING.

(use-package :c)
(let ((warnings nil))
(handler-bind ((compiler-message #'(lambda (c)
(push c warnings))))
(compile-file "foo.lsp" :verbose nil :print nil))
(format t "~&;;; Printing compiler messages")
(loop for m in (nreverse warnings)
for i from 0
do (format t "~&~@<;;; ~@;Message #~D~%~A~:>" i m)))

- On Windows, ECL recognizes the environment variables HOMEDRIVE and HOMEPATH
and uses them to construct the output of user-homedir-pathname.

- We switch to an Ubuntu-like versioning system, based on $(year).$(month).x
where "x" is 0 for a release or any higher number for a patched version.

- In Unix-type systems, ECL now installs with a "soname" and using versioned
directory names, such as /usr/lib/ecl-8.9.0, /usr/lib/libecl.so.8.9, etc

- New configuration flag, --without-fpe, to disable floating point exception
code in platforms that have buggy implementations of feenableexcept().

- Changes in the build process of the Microsoft Visual C++ port contributed
by Muhammad Haggag.

- All known C signals are now exported by ECL as constants in the EXT package,
such as EXT:+SIGINT+, EXT:+SIGFPE+, etc.

- Function (EXT:CATCH-SIGNAL signal-code boolean) can be used to tell ECL to
trap or ignore certain signals. In a near future a function can be provided.

- In platforms that support sigaltstack(), ECL may detect stack overflows and
gracefully quit.

- The help file now contains all functions in the library, including
internal ones.

- A new configuration flag, --with-signed-zero, determines whether ECL supports
IEEE 754 signed zeros

- EXT:RUN-PROGRAM now returns two values: the two way stream and the exit code
of the process if :WAIT is T (Josh Elsasser)

- Some symbols now belong in the EXT package: EXT:GETENV, EXT:SETENV,
EXT:GETCWD, EXT:CHDIR.

- EXT:GETCWD by default always update the value of *DEFAULT-PATHNAME-DEFAULTS*

- *DEFAULT-PATHNAME-DEFAULTS* is initialized to the value of EXT:GETCWD.

- A new command line option, -debug, enables the debugger whenever an error
happens. The converse is -nodebug.

- We now ship version 0.7.3 of the portable CLX library.

- A new method, STREAM-FILE-POSITION, has been added to the Gray
streams package.

* Embedding:

- ECL now implements a more transparent interface for setting and querying
options related to signal trapping, stack sizes and general behavior. These
are options that should be set before calling cl_boot() to customize later
behavior. It does not make sense to change them at run time. The current
list of options is set with ecl_set_option(code, value) and queried with
ecl_get_option(code):
ECL_OPT_INCREMENTAL_GC,
ECL_OPT_TRAP_SIGSEGV,
ECL_OPT_TRAP_SIGFPE,
ECL_OPT_TRAP_SIGINT,
ECL_OPT_TRAP_SIGILL,
ECL_OPT_TRAP_SIGBUS,
ECL_OPT_BOOTED, /* read only */
ECL_OPT_BIND_STACK_SIZE,
ECL_OPT_BIND_STACK_SAFETY_AREA,
ECL_OPT_FRAME_STACK_SIZE,
ECL_OPT_FRAME_STACK_SAFETY_AREA,
ECL_OPT_LISP_STACK_SIZE,
ECL_OPT_LISP_STACK_SAFETY_AREA,
ECL_OPT_C_STACK_SIZE,
ECL_OPT_C_STACK_SAFETY_AREA,
ECL_OPT_SIGALTSTACK_SIZE,
ECL_OPT_LIMIT

- Two new convenience functions, ecl_defparameter() and ecl_defvar.

* Bugs fixed:

- The optimizer for COERCE might enter an infinite loop for certain type intervals.

- The sharp macros #n# and #n=... did not work well with arrays of an specialized type.

- Deactivate --enable-asmapply by default, because it is still an exerimental
feature.

- In compiled files, externalize package objects using FIND-PACKAGE.

- In RUN-PROGRAM, there were two bugs: first, the keyword :WAIT was not
defined in the C core and caused an error when used; second, if the output
stream was missing or directed to the standard output, it would fail.

- SI:LOAD-FOREIGN-MODULE does not coerce the library name to a truename
before loading. Instead, it leaves this task to the appropriate routine,
dlopen or similar.

- Bytecode objects created inside an eval-when had an invalid name.

- SI:LOAD-FOREIGN-MODULE now relies on dlopen/LibraryLoad/... to find the
foreign libraries. Nevertheless, duplicate libraries are still identified
> (si::load-foreign-module "libm.dylib")
#<codeblock "libm.dylib">
> (si::load-foreign-module "/usr/lib/libm.dylib")
#<codeblock "libm.dylib">

- In reading functions, the value of :RECURSIVE-P should not interfere with
that of :EOF-ERROR-P.

- The MSVC port can be built with support for unicode characters.

- PROCLAIM/DECLAIM now understand the abbreviated form of type declarations
user-defined and complex types.

- Sharp-dot macro reader (#.) gets its own sharp-equal context (#=) so that
the following form
(read-from-string "'#.(princ (list '#1=(1 2) '#1#))")
actually prints the right list (#1=(1 2) #1#).

- Inline/not-inline declarations for SETF-functions are not ignored (Josh
Elsasser).

- When a SETF place is a macro, it has to be expanded with MACROEXPAND-1.

- In FTYPE proclamations and declarations, the type may now be a user defined
function type (Josh Elsasser).

- COMPILE would create an extra empty file which would not get deleted after
finishing compilation (Josh Elsasser).

- On overflow, binding and frame stack signal a correctable error with
STACK-OVERFLOW condition.<
(block faa
(labels ((foo (x)
(catch 'foo (foo (1+ x))))
(handle-overflow (c)
(let ((s (ext:stack-overflow-size c)))
(if (< s 2304)
(continue)
(return-from faa (ext::stack-overflow-type c))))))
(handler-bind ((ext:stack-overflow #'handle-overflow))
(foo 1))))

- New function (EXT:SET-STACK-SIZE type size) can resize type =
EXT:BINDING-STACK, EXT:LISP-STACK and EXT:FRAME-STACK.

- FLOAT-SIGN returns the right value on negative zeros.

- The reader and the printer now understand negative zeros.

- Negative and nonnegative zeros are not EQL.

- ENSURE-DIRECTORIES first has to merge the path with *DEFAULT-PATH...*

- SUBTYPEP does not support complex CONS type specifiers. This caused the
compiler to choke on declaration such as (CONS INTEGER (CONS T T))
and the like.

- The value of *DEFAULT-PATHNAME-DEFAULTS* has to be of type pathname. Other
pathname designators are not allowed and a correctable error is signaled
when the value of this variable is found to be of the wrong type.

- DIRECTORY would fail to handle symbolic links under certain conditions.

- The optional type checks generated by the compiler are based on TYPEP and
thus they fail when the declaration type contains a function type (FUNCTION
(...) ...) This is now solved by replacing parts of these types with the
simple type FUNCTION.

- Hash tables were not properly serialized.

- WRITE/READ-LINE and READ-BYTE did not work with gray streams (A. Vodonosov)

- When working with Gray streams, READ-LINE did not handle the EOF properly.

- The routine that computed the class precedence list produced the wrong
result for moderately complex class hierarchies. It has been replaced with
a version that exactly implements the algorithm in the ANSI specification.

- At the toplevel, the value of *read-suppress* is ignored, so that
setting (setf *read-suppress* nil) does not prevent the user from entering
new commands.

Post Reply