[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
collector.
- 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
miscalculations.
- 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
double-float.
- 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
"c:/jjgarcia/bin/foo"
- 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
STANDARD-CHAR.
- The FFI will signal a type error when converting extended characters to
the C types "char" or "unsigned char".
- Unicode support for ALPHA-CHAR-P, ALPHANUMERICP, CHAR-UPCASE, CHAR-DOWNCASE,
etc, based on the ISO C99 library functions for wide characters.
- Following functions fixed to work with Unicode strings: EQUAL, EQUALP,
PARSE-INTEGER, STRING-TRIM, STRING-LEFT-TRIM, STRING-RIGHT-TRIM,
COPY-STRUCTURE, SHADOW.
- 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
(SETQ B)
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
extensions.
- EXT:PROCESS-COMMAND-ARGS now allows for a default rule.
- Variable EXT:*HELP-MESSAGE* and EXT:+DEFAULT-COMMAND-ARG-RULES+ exported.
- 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,
EXPT, TAN, TANH, SINH, COSH, LOG, ATAN, RATIONAL, NUMERATOR, DENOMINATOR,
FLOOR, CEILING, ROUND, TRUNCATE, FLOAT-PRECISION, FLOAT-SIGN, DECODE-FLOAT,
SCALE-FLOAT, FLOAT-RADIX, FLOAT-DIGITS, INTEGER-DECODE-FLOAT, REALPART,
IMAGPART, COMPLEX, etc
- 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(),
NUMBER_TYPE() -> ECL_NUMBER_TYPE_P().
- 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
/usr/lib/ecl.
* Contributed code:
- New examples: cmdline/ls.lsp, ffi/uffi.lsp, ffi/cffi.lsp
More information about the ecl-devel
mailing list