ECL 12.7.1:
===========
* Bugs fixed:
- The implementation of locks and condition variables based on POSIX threads
was not safe under interrupts. It has all been reimplemented using atomic
userspace operations plus a new wait queue.
- :CDECL was not accepted as an FFI declaration due to a typo.
- REMOVE-METHOD and FIND-METHOD were not generic functions.
- MAKE-LOAD-FORM's methods for standard-object, structure-object and
condition did not signal an error).
* Visible changes:
- ECL builds with support for threads by default (where available).
- DIRECTORY no longer complains when it finds an inexistent directory
component: it simply returns NIL as the list of pathnames.
- CASE now complains when the OTHERWISE/T clause is not the last one.
- Instead of issuing an error, LOOP now only produces a STYLE-WARNING
when iteration forms appear at the wrong place, as in (LOOP WHILE ...)
followed by some assignment.
- EXT:MKDIR no longer accepts pathnames as inputs to avoid problems with
pathnames that contain name or type components.
- ENSURE-DIRECTORIES-EXIST accepts the keyword argument :MODE which is
passed to MKDIR.
- In EXT:RUN-PROGRAM the child process is delayed until the parent has created
the process structure and stored the process id in it. Formerly we had race
conditions due to the child exiting before the parent was able to call
sigwait().
- Where available, ECL now defines the constants EXT:+SIGRTMIN+ and
EXT:+SIGRTMAX+, as well as EXT:+SIGRT0+ through EXT:+RTMINn+ where n =
SIGRTMAX - SIGRTMIN Those signals can be then trapped.
- The interrupt handler for floating point exceptions does not care about
the value of EXT:*INTERRUPTS-ENABLED* or similar mechanisms because such
interrupt has to be treated as an error, not as something optional. The
same applies to other evil signals, such as SIGSEGV or SIGBUS.
- New functions (EXT:GET-INTERRUPT-HANDLER code) and
(EXT:SET-INTERRUPT-HANDLER code function-designator) allow the user to
customize how these interrupts are caught. SET-INTERRUPT-HANDLER runs an
implicit EXT:CATCH-SIGNAL.
- ECL now exports the symbols FFI:C-INT-MAX, FFI:C-INT-MIN, FFI:C-LONG-MAX,
etc, which correspond to the POSIX C constants INT_MAX, INT_MIN, LONG_MAX,
and similar ones.
- APROPOS-LIST no longer returns duplicate symbols.
- The ABORT restart is now bound on every new thread (except the main one,
where either the user or the toplevel must take care of that).
* Windows:
- ECL guesses whether the input / output / error streams are consoles. If
so, it sets up a special type of stream that copes with the deficiencies
of read()/write() and similar functions on consoles -- namely that they
may read or write a larger number of bytes than demanded because they
translate the input/output to and from the corresponding codepage.
(EXPERIMENTAL)
- ECL detects the codepage that the console is using and applies it as
the appropriate external format (with :CRLF convention).
- ECL's console stream signals EOF when Ctrl-Z is detected.
* Metaobject protocol:
- Implemented CLOS:COMPUTE-APPLICABLE-METHODS-USING-CLASSES.
- COMPUTE-APPLICABLE-METHODS and CLOS:COMPUTE-EFFECTIVE-METHOD are now
generic functions.
- Implemented and used in the core: VALIDATE-SUPERCLASSES
- UPDATE-DEPENDENT, MAP-DEPENDENTS and related functions have been fixed. They
are now invoked by REMOVE-METHOD and REINITIALIZE-INSTANCE, when acting on
generic functions, standard classes, etc.
- (SETF CLASS-NAME) is now implemented using REINITIALIZE-INSTANCE.
- ENSURE-CLASS-USING-CLASS now registers the class with
FIND-CLASS. ENSURE-CLASS relies on E-C-U-C doing that.
- EXTRACT-LAMBDA-LIST and EXTRACT-SPECIALIZER-NAMES implemented.
- CLOS:GENERIC-FUNCTION-DECLARATIONS and slot CLOS:DECLARATIONS are now
implemented (even if not used by ECL itself).
- Implemented the class CLOS:METAOBJECT
- Implemented SPECIALIZER and EQL-SPECIALIZER, together with
ADD-DIRECT-METHOD, REMOVE-DIRECT-METHOD, SPECIALIZER-DIRECT-METHODS,
SPECIALIZER-DIRECT-GENERIC-FUNCTIONS and EQL-SPECIALIZER-OBJECT. ECL now
uses these objects internally for method dispatch.
- DEFMETHOD now relies on MAKE-METHOD-LAMBDA to create the appropriate
function.
- Implemented COMPUTE-DISCRIMINATING-FUNCTION.
- ECL's discriminating functions use COMPUTE-APPLICABLE-METHODS-USING-CLASSES
on those classes in which the user may redefine or extend the
method. Elsewhere, ECL relies on the internal equivalent of
COMPUTE-APPLICABLE-METHODS, which _always_ memoizes results.
- When reinitializing a class instance, ECL would not remove the class from
its former superclasses.
- The method combination slot of a generic function is now precomputed by
using FIND-METHOD-COMBINATION in SHARED-INITIALIZE.
- METHOD-COMBINATION is now a class with slots and it is used by ECL for
computing effective methods.
- The MOP and CL classes and metaclasses do not contain any slot whose name
is exported by any of the CL or CL-USER packages.
ECL 10.4.1:
===========
* Bugs fixed:
- Fixed offset problems in READ/WRITE-SEQUENCE.
- In multithreaded ECL, the signal servicing thread was not created
due to a stale debug statement.
- The tool 'ecl-config' contained unsubstituted values, such as @LDRPATH@
because these variablesls had been renamed in the autoconf file.
- The reimplementation of DIRECTORY introduced a bug in pathnames with ending
double wildcars, such as "/foo/**/".
- EXT:SAFE-EVAL (or cl_safe_eval in C) would attempt to start the debugger
when an error was signaled.
- The logical hostname EXT: did not have a pathname translation relative to
that of SRC:
- After loading the compiler, the COMMON-LISP package was left unlocked
against changes.
- ECL can build again itself using a C++ compiler (--with-cxx thus works).
- ecl_make_file_stream_from_fd() did not set the right mode in the stream
structure.
- ECL did not understand type declarations that involved symbol macros.
- (SETF STREAM-EXTERNAL-FORMAT) inserted the wrong format type in some cases.
* Visible changes:
- The source location annotator records the original pathnames instead of
truenames. This allows Slime to find out the ECL sources even if they
have been moved.
- The signal servicing thread now carries the name SI:SIGNAL-SERVICING, which
is different from the name of the threads that are created to actually
handle those signals. Users should avoid killing SI:SIGNAL-SERVICING.
- FFI:CLINES admits the notation @lisp-object, just like FFI:C-INLINE. The
result is that @lisp-object gets replaced with a pointer to the given
lisp object, created at run time.
- Gray streams implement a new generic function, GRAY:STREAM-FILE-DESCRIPTOR
which is used by SERVE-EVENT to gather the C file descriptor or Windows
handle used to wait on input from the device.
- ECL restores the habit of installing manual pages for ecl and ecl-config.
- We have removed the obsolete versions of the documentation files. The
up to date documentation now lives in a separate source repository,
as explained in http://ecls.sourceforge.net/download.html
- The encoding :DEFAULT implies looking up in the special variable
EXT:*DEFAULT-EXTERNAL-FORMAT* the actual value of the encoding, which may be
a known one, or :pass-through.
- LOAD now accepts the keyword argument :EXTERNAL-FORMAT
* ASDF:
- ECL's contributed modules and ECL's compiler can now be used in standalone
programs, for they are now stored both in FASL form and as statically linked
libraries.
- ASDF:MAKE-BUILD takes a new keyword argument, :MOVE-HERE, that allows moving
the files that ASDF creates to the current directory. :MOVE-HERE can be the
boolean value T, in which case the files are output at ./asdf-output/ or a
pathname designator with the actual destination.
- ASDF:MAKE-BUILD admits a new type, :BINARY, which creates a standalone
system (*.asd) accompanied by two binary files, statically linked library
(.a or .lib), and a FASL (*.fasb). This can be used, to replace existing
systems with precompiled ones.