[Ecls-list] ECL 0.9j released

Juan Jose Garcia-Ripoll jjgarcia at users.sourceforge.net
Sat Dec 29 12:08:00 UTC 2007

Announcement of ECL v0.9j

ECL stands for Embeddable Common-Lisp. The ECL project aims to produce
an implementation of the Common-Lisp language which complies to the ANSI
X3J13 definition of the language.

The term embeddable refers to the fact that ECL includes a lisp to C
compiler, which produces libraries (static or dynamic) that can be
called from C programs. Furthermore, ECL can produce standalone
executables from your lisp code and can itself be linked to your
programs as a shared library.

ECL supports the operating systems Linux, FreeBSD, NetBSD, OpenBSD,
Solaris (at least v. 9), 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 Common-Lisp.net and 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 some useful documentation.

Notes for this release

This is mostly a bugfix release, but it includes several interesting
new features, such as the SERVE-EVENT package, ported from SBCL by
Steve Smith, finalization of lisp objects and installation of ECL
on standard unix paths

Changes since 0.9i

* New platforms:

 - Support for GNU/kFreeBSD and Mac OS X Leopard.

 - ECL has additionally been ported to GNU/Hurd (Pierre Thierry) and
   HP NonStop S-Series (Craig McDaniel)

* New features:

 - ECL now has POSIX condition variables when built with threads. Moreover,
   locks can be now recursive or non-recursive, that is, the kind that signals
   an error when tried to grabed twice from the same thread (Dan Corkill).

 - SBCL's SERVE-EVENT package has been ported to ECL by Steve Smith.

 - New commands, :RESTART, :R1, :R2, etc, allow invoking restarts (contributed
   by Chui Tey).

 - Interpreted functions can now be disassembled in the debugger. The commands
   are :D and :DISASSEMBLE.

 - New (private) function EXT::FUNCTION-LAMBDA-LIST, returns the lambda list of
   a function whenever it was recorded.

 - Implemented finalization on the lisp level. Only available for the Boehm
   Weiser GC. Finalizers are closures which can be attached to objects
   using SI:SET-FINALIZER and SI:GET-FINALIZER. Only one closure per
   object is allowed.

 - [Win32] Command-line arguments are now available for programs compiled with
   :SYSTEM set to :WINDOWS (M. Goffioul)

 - MAPCAR, MAPLIST, MAPC, MAPL, MAPCAN, MAPCON have now compiler macro functions
   which create equivalent inlined forms.

 - Support for C "long double" as lisp long-double datatype (originated from
   a patch by Lars Brinkhoff). Still missing compiler support for unboxed
   long double types.

 - TIME outputs information about consed bytes and calls to the garbage

 - MAKE-ARRAY accepts a foreign pointer as an argument to :DISPLACED-TO That
   creates a lisp array on top of the foreign data and can be used to directly
   scan C strings, or unboxed arrays of numbers.

 - DFFI works now on AMD64 or Intel EMT64 (DFFI stands for Dynamical Foreign
   Function Interface and it is the component that allows ECL call directly
   C functions and create C callbacks without the C compiler being around).
   (initial code by M. Goffioul)

 - Using version 6.8 of the Boehm-Weiser garbage collector.

 - Using version 4.2.1 of the GMP library.

 - Random number generator based on the Mersenne-Twister algorithm (Based on
   code contributed by Roy Zywina).

 - GET-INTERNAL-RUN/REAL-TIME now have a better resolution of microseconds
   when the platform allows it.

* Bugs fixed:

 - The Windows installer works again.

 - Local C variables are now always marked as volatile if the function code
   uses setjmp/longjmp. Detection of this cases is also more accurate.

 - COMPILE-FILE-PATHNAME accepts the same keyword arguments as COMPILE-FILE.

 - COMPILER-LET is not standard and belongs in the EXT package. However, it had
   not been imported into the compiler and thus it did not work at all.

 - Remove ancient, bogus optimizers for: ASH, LDB.

 - MINGW's compiler is broken: it does not accept directories with trailing
   slashes as an argument to "-I". We include a hack in cmpmain.lsp for that.

 - Streamp signals an error for Gray streams.

 - ENOUGH-NAMESTRING provided too large directory names (Contributed by Tim S)

 - ADJUST-ARRAY accepted a fill-pointer even for arrays that did not have any.

 - Instead of using SHORT-FLOAT and LONG-FLOAT as basic floating point types,
   we use SINGLE-FLOAT and DOUBLE-FLOAT now. The names of the C functions have
   changed accordingly (Contributed by Lars Brinkhoff).

 - There was a problem with the variable capture when creating accessors
   methods for classes.

 - [Win32] Processes are now correctly listed with MP:ALL-PROCESSES
(M. Goffioul)

 - DIRECTORY behaves more according to people's expectations
	(DIRECTORY "*/") => List all directories in current path
	(DIRECTORY "*.*") => List all files in current path
   This means you need to make two calls to DIRECTORY to get all the content of
   it, but it allows you to select whether you want to list files or
   not. Furthermore, the paths returned by DIRECTORY are more or less
   guaranteed to match the mask -- the exception are links, for whose the
   truename is returned.

 - [Win32] DIRECTORY did not take the drive letter into account.

 - [Win32] si_trap_fpe is now exported by ecl.dll

 - Instead of sharing a single string buffer (cl_env.token), ECL now has a pool
   of small strings which can be used for temporary operations. This fixes a
   number of problems with the reader.

 - DIRECTORY would always match NIL entries, independent of the mask. Now, the
   following two statements differ:
	(directory "foo*")       => ("foo")
	(directory "foo*.*")     => ("foo" "foo.log")

 - The code in contrib/sockets.lisp was not compatible with C++ because of
   multiple implicit pointer conversions, and additionally it had some pointer

 - GET-INTERNAL-REAL-TIME now works on Windows with 1/60s precision
   (contributed by Dustin Long)

 - When :INITFORM was a constant variable but not self evaluating (i.e. not T,
   NIL, or a keyword), it was not processed properly
	(defclass a () ((a :initform most-positive-fixnum)))
	(slot-value (make-instance a) 'a) => most-positive-fixnum

 - The namestring "." was improperly parsed as having file type "".

 - Now the file type is determined by the last dot in the name.
	(pathname-type "foo.mpq.txt") => "txt"

 - When iterating over a hash table we now check that the argument is really a
   hash table.

 - *COMPILE-VERBOSE* and *COMPILE-PRINT* now also have effect when compiling
   isolated lambda forms using COMPILE. Additionally, these variables are
   defined even without the compiler loaded.

 - DESCRIBE was not prepare for the number range types returned by TYPE-OF.

 - In OS X, ECL can now load shared libraries (Extension *.dylib) thanks
   to using dlopen() instead of the obsolete NSLinkModule() function.

 - (CONCATENATE 'STRING ...) does no longer have an ad-hoc limit in the number
   of strings.

 - Reader for #( did not always read the last parenthesis, what lead
to a warning:
	> #3(1 2 3)
	#(1 2 3)
	> ;;; Warning: Ignoring an unmatched right parenthesis.

 - RANDOM no longer overflows when the input is a bignum that does not fit in a

 - MAKE-PATHNAME should remove all occurrences of single dots "." in physical
   pathnames and does not interpret the directory component :BACK properly.

 - ENOUGH-NAMESTRING did not simplify a pathname when it had the same directory
   as the default pathname.

 - Some toplevel forms with closures caused the compiler to abort, for example
	(let ((data '(a b)))
	  (flet ((get-it ()
	          (second data)))
	    (defun print-it-1 ()
	      (print (get-it)))))

 - COPY-READTABLE did not copy entries when supplied a second argument.

 - When expanding tilde pathnames, as in "~/bin/foo", the device is also
   taken into account. So if HOME=c:/jjgarcia, the previous path becomes

 - If the homedir component contains a tilde itself, ECL entered an infinite
   loop when expanding the pathname

 - Now it should be possible to load the same FASL files multiple times,
   even if previous instances have not completely garbage collected.

 - SI:MKSTEMP now works on Windows for more than 26 temporary file names
   (Dustin Long)

 - There was no builtin type for loaded libraries.

 - EXT:RUN-PROGRAM has now a keyword argument :WAIT, which defaults to T and
   which determines whether the function should wait for the process to finish
   before returning.

* Unicode:

 - MAKE-STRING only allowed :ELEMENT-TYPE to be one of CHARACTER, BASE-CHAR, or

 - The FFI will signal a type error when converting extended characters to
   the C types "char" or "unsigned char".

   etc, based on the ISO C99 library functions for wide characters.

 - Following functions fixed to work with Unicode strings: EQUAL, EQUALP,

 - Most functions dealing with sequences (REMOVE, DELETE, etc) would
   output a STRING even if the input was a BASE-STRING.

 - TYPE-OF did not recognized EXTENDED-CHARs.

 - Type BASE-STRING and STRING were defined as equivalent.

 - Pathnames now allow extended strings in the names. Errors are signalled,
   however, when a file name contains illegal characters. UTF-8 encoding
   of file names is not supported.

* Other visible changes:

 - New conditional feature, PREFIXED-API, signals that the internal C functions
   now have a common prefix, "ecl_".

 - The interpreter now makes an attempt at showing the offending form
   when a syntax error happens.
	>  (progn (setq a 1) (setq b) (setq c 2))
	In form
	Syntax error: list with too few elements or improperly terminated.
	Broken at SI:EVAL-WITH-ENV.No restarts available.
	Broken at SI::BREAK-WHERE.

 - The documentation shipped with ECL was outdated. To enforce moving on
   to the new manual, the build and installation process now ignores anything
   inside src/doc.

 - LOAD no longer defaults to loading a file as binary if the file type is
   different from FAS or FASL. Use either SI:LOAD-BINARY or configure the
   variable SI:*LOAD-HOOKS* accordingly to load FASL files with unusual

 - EXT:PROCESS-COMMAND-ARGS now allows for a default rule.


 - C:BUILD-PROGRAM now uses a unique prefix for the initialization function,
   init_ECL_PROGRAM, to avoid collisions when both the program and a component
   have the same name:
	(C:BUILD-PROGRAM "ls" :lisp-files '("ls.o"))

 - FFI:CLINES is no longer restricted to appear as a toplevel form. The
   following code is thus valid:
	(defun c-sin (x)
	  (ffi:clines "#include <math.h>")
	  (ffi:c-inline (x) (:double) :double "sin(#0)" :one-liner t))

 - Minimized the number of headers included by ecl/ecl.h. In particular,
   stdio.h, inittypes.h and pthread.h are no longer used.

 - When a compiler finds a literal standard object, the load and initialization
   forms it generates are now closer to the first reference to the object. This
   allows to have, in the same file, a class definition and a constant which
   is an object of that class.

 - Support for hierarchical package names, as in Allegro Common-Lisp.

 - The debugger now prints a list of available restarts.

 - Added restarts to the errors signaled by several functions: SIN, COS, EXP,

 - DIGIT-CHAR-P and DIGIT-CHAR will signal an error if the radix is not an
   integer value between 2 and 36, both included.

 - The slot accessors for structures with type VECTOR or LIST now rely on
   the standard function ELT, instead of si:list-nth and si:rplaca-nthcdr.

 - TYPE-OF returns expanded types for arrays. For instance,
   (ARRAY CHARACTER (12)) instead of (STRING 12).

 - C functions which disappear: si_set_compiled_function_name(),
   si_extended_string_concatenate(), assert_type_string(),
   assert_type_character(), assert_type_symbol(), make_symbol(),
   parse_number(), parse_integer(), adjust_displaced().

 - Lisp functions which disappear: si:set-compiled-function-name,
   si:extended-string-concatenate, si:list-nth, si:rplaca-nthcdr.

 - New C functions: ecl_stream_to_handle(), ecl_base_char_code(),
   ecl_type_error(), ecl_check_cl_type(), ecl_check_type_string(),
   ecl_fixnum_in_range(), ecl_stringp(), ecl_parse_number(),
   ecl_parse_integer(), ecl_char(), ecl_char_set(), ecl_base_char_p().

 - New Lisp functions: si:wrong-type-argument.

 - Functions renamed: backup_fopen() -> ecl_backup_fopen() char_code() ->
   ecl_char_code(), cl_log1() -> ecl_log1(), cl_log2() -> ecl_log2(),

 - Additionally, most functions have got now the prefix "ecl_"

 - LOAD-FOREIGN-LIBRARY accepts an additional keyword argument :SYSTEM-LIBRARY
   which, when true, tells ECL to link object files against the system version
   of that library instead of directly referencing the shared library: i.e. use
   linker flag -lmylib instead of libmylib.so (Brian Spilsbury)

 - When compiling lisp files, ECL now creates different entry functions
   depending on the file type. FASL, library and object files get a function
   with the prefix {init_fas, init_lib, init_} prepended to the file name.
   This solves the problem of a shared library having the same name as one
   of the components it is made of.

 - C:BUILDER searches the ASDF module list for libraries. (Thanks to
F.R. Rideau)

 - In Windows, CLX is no longer built by default: use "nmake ECL_CLX=1".

 - ECL now uses standard Unix paths for installation: assuming prefix=/usr, the
   shared library libecl.so is typically installed in /usr/lib/, the C header
   files under /usr/include/ecl and all remaining data and FASL files under

* Contributed code:

 - New examples: cmdline/ls.lsp, ffi/uffi.lsp, ffi/cffi.lsp

More information about the ecl-devel mailing list