[Ecls-list] ECL 0.9d released

Juan Jose Garcia Ripoll lisp at arrakis.es
Tue Nov 2 06:09:23 UTC 2004

Announcement of ECL v0.9d

ECL stands for Embeddable Common-Lisp. The ECL project is an effort to
modernize Giuseppe Attardi's ECL (ECoLisp) environment to produce an
implementation of the Common-Lisp language which complies to the ANSI
X3J13 definition of the language.

ECL supports the operating systems Linux, FreeBSD, NetBSD, Solaris,
Microsoft Windows and OSX, running on top of the Intel, Sparc, Alpha
and PowerPC processors. Porting to other architectures should be
rather easy.

ECL is currently hosted at SourceForge. The home page of the project
is http://ecls.sourceforge.net, and in it you will find source code
releases, a CVS tree and an up to date documentation.

Notes for this release

This release add support for compiling lisp code as shared libraries
under the OSX and Microsoft Windows operating systems, and makes ECL
compile and run again under Solaris/Sparc, now using 64-bit
pointers/fixnums when available.

Furthermore, ECL now is shipped with a working port of the CLX
library, a pretty printer, and is capable of using ASDF (when
configured with the flag --with-cmuformat).

ECL 0.9d

* Supported platforms:

  - ECL now builds under Windows using MinGW-32 and Microsoft VC++
    (the last port is a contribution from Goffioul Michael).

  - It is possible now both under OS/X and Microsoft Windows to build
    ECL as a shared library and to compile and load code on the fly.

  - ECL now uses the configuration files of GMP to guess the best
    compilation/linking flags for a given architecture. This is required
    in platforms such as Solaris/Ultrasparc, where there are multiple
    ABIs (i.e. applications may use 32-bit or 64-pointers, 32-bit or
    64-registers, etc). On other platforms this process is not required,
    and you may get a faster configuration using --enable-simple-conf

* System design: Multithreading

  - Almost all data specific to ECL has migrated into two structures:
    CL_ENV and CL_CORE. The first one contains stacks and other data
    that is specific to a process. The second one contains data common
    to the whole environment. CL_ENV is an actual variable in
    single-threaded ECL, and a pointer to a thread-local structure in
    a multi-threaded ECL.

  - The implementation of thread-local dynamic bindings uses hash
    tables to keep the value of the symbols.

  - The actual implementation uses POSIX threads under Linux. Ports to
    other operating systems are being worked out.

* System design: Debugging

  - The bytecodes interpreter now implements a barebones debugger, in
    which the facilities TRACE, STEP are available, and the content of
    local variables may be inspected and changed. To use the debugger,
    you must have activated the memoization of function definitions,
    by using (setf si::*keep-definitions* t). Sample session:
	> (defun foo (x) (print x)) (step (foo 2))
	Top level.
	> (FOO 2) ->
	(PRINT X) - :v
	Block names: FOO.
	Local variables:
	  X: 2
	Broken at FOO.
	(PRINT X) - (setf x 3)
	Broken at FOO.
	(PRINT X) - :v
	Block names: FOO.
	Local variables:
	  X: 3
	Broken at FOO.
	(PRINT X) -
	Top level.

* System design: Compiler

  - The optimizer for tail-recursive calls has been fixed. Formerly
    the check for tail-recursion was based on names, and this produced
    an infinite loop:
	(labels ((f1 (x)
		   (labels ((f1 (x) 2))
		      (f1 x))))
	  (f1 2))
    Now the compiler recognizes that the first call to (f1 x) refers
    the innermost function, and there is no tail recursion.

  - The compiler now produces C functions with a fixed number of
    arguments when the lisp function is not a closure and has no
    &optional, &rest, &key or &allow-other-keys.

  - MULTIPLE-VALUE-{BIND,SETQ} produce now more economical forms.

  - A separate pass over the functions is used to find out which ones
    use a lexical environment, which functions are made into closures,
    etc (This implied a much deeped rewrite of the compiler than what
    these three lines seem to suggest).

  - FLET and LABELS are now compiled by the same routine.

* Errors fixed:

  - Bugs in the mechanism for automatically creating packages when
    loading binary files.

  - The value of LDFLAGS supplied at configuration time, was not used
    when building shared libraries or FASL files.

  - HASH-TABLE-SIZE and HASH-TABLE-TEST have been finally implemented.

  - The configuration process now does respect the values of libdir,
    bindir, infodir,... supplied by the user.

  - SLOT-EXISTS-P now works with all types of objects.

  - LCM now works when any of the arguments is 0.

  - SIGNUM now accepts complex arguments.

  - COMPILE-FILE now handles files with relative pathnames (like

  - In destructuring lambda lists, () or NIL is understood as an empty

  - (VALUES (FOO)) was compiled as a simple call (FOO), without
    truncating the number of values output by the latter.

  - The printer of floating point numbers was inaccurate and could not
    represent MOST-POSITIVE-LONG-FLOAT reliably.

  - Assignments to structures were not properly compiled in unsafe mode.

* Documentation:

  - New manual page documents the scripting facilities of ECL
    (contributed by Julian St.)

* Visible changes:

  - ECL now distinguishes between the current working directory of the
    C library (obtained by SI::GETCWD and changed with SI::CHDIR) and
    the directory for the lisp environment (the value of
    *DEFAULT-PATHNAME-DEFAULTS*). The internal routine SI::CHDIR now
    takes arguments: the new directory, and an optional boolean
    that determines whether *DEFAULT-PATHNAME-DEFAULTS* is also to be
    changed (defaults to true).

  - New command line options -shell and -norc, which are useful for
    scripting. New and more robust handling of command line options,
    permits combining (and repeating) the options -load, -eval, -shell
    in a number of ways.

  - SI:FILE-COLUMN now always returns a number, which may be 0 for
    streams that do not have that information.

  - The compiler (COMPILE-FILE, COMPILE, etc), now understands
    logical pathnames.

  - Under windows, the system directory is defined to be the place
    where ecl.exe resides. Windows user will want to use the
    command "make windows-dist", which builds a ZIP file with a
    ready to be installed ECL.

  - If you want to install ECL to a different place, use "make prefix=..."
    instead of the old form "make PREFIX=...". ECL now follows the GNU
    coding standards in this particular point.

  - The script "ecl-config" now returns only the essential flags to compile a
    file that links against ECL. It does not include optimization flags, or
    flags to create position independent object files.

  - Fixed a long lasting bug: the TEST or TEST-NOT function to
    [N]SET-EXCLUSIVE-OR can assume that the first argument belongs to
    the first list and the second to the second one. However, ECL
    would not respect this.

  - TRUENAME now merges a pathname with the current working directory
    when it has no directory of its own. Thus (TRUENAME #P"") is
    equivalent to (SI:GETCWD).

  - The old CLX library has been replaced with the portable CLX
    library from the TELENT archive.

  - New command line option, -q, makes the compiler quieter (by Julian

  - New function, SI:RUN-PROGRAM to spawn processes with redirected
    input, output and error streams.

* ANSI compatibility:

  - No symbol is exported from the CL package other than those specificied in
    the standard. ECL extensions, such as the types BYTE8, UNSIGNED-BYTE8,
    are now in the package EXT (which is temporarily an alias of SYSTEM).

  - The following functions have been implemented: BROADCAST-STREAM-STREAMS,

  - The generic function for handling CLOS streams (STREAM-READ-CHAR,
    STREAM-CLEAR-INPUT, etc), are now in the EXT package.

  - HASH-TABLE-REHASH-THRESHOLD can now be any number in (REAL 0 1). Integers
    above 1 are not allowed, and the threshold is always interpreted as the
    relative filling of the hash table before growth (Before, the threshold
    could be an integer number with a somewhat obscure interpretation).

  - SXHASH now always returns positive fixnums and produces the same key for
    two bitvectors which are EQUAL.

  - Implemented the class redefinition protocol, which involves

  - There is support for the :CASE argument in all pathname functions
    that require it (Contributed by Julian Stecklina). The function
    PARSE-NAMESTRING now handles the optional host and
    default-pathname arguments properly. MAKE-PATHNAME now signals
    conditions of type FILE-ERROR when the components of the pathname
    have errors (wrong types, '(:ABSOLUTE :BACK), etc).

  - When creating methods, the parameter specializer names are
    converted into canonical parameter specializers (i.e. either
    classes or EQL specializers). Thus, if a method specializes on
    class A and this class is renamed as B, the method still
    specializes on the same class.

    (which similar to CMUCL looks for the translations at sys:host.translation).

  - Streams now can have element types CHARACTER, (SIGNED-BYTE 8) and

  - A VALUES form can now act as a place.

  - All non-graphic characters below (CODE-CHAR 128) have now
    character names.

  - The pretty printer and the FORMAT routine from CMUCL have been
    finally integrated and put together. By default, they are not
    compiled in, unless configured with "--with-cmu-format".

  - When comparing floats with bignums or rationals, the float has to
    be converted first to a rational number, or else the comparison
    will be inaccurate.

  - :PRINT-OBJECT is now supported in structures.

  - FORMAT directives now accept bignums as arguments, though they
    are truncated to most-{positive/negative}-fixnum.

More information about the ecl-devel mailing list