From: Juan Jose Garcia Ripoll
Subject: [ANN] ECL 0.9d released
Date: 
Message-ID: <2upi6aF2d6amkU1@uni-berlin.de>
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))
	FOO
	Top level.
	> (FOO 2) ->
	(PRINT X) - :v
	Block names: FOO.
	Local variables:
	  X: 2
	Broken at FOO.
	(PRINT X) - (setf x 3)
	3
	Broken at FOO.
	(PRINT X) - :v
	Block names: FOO.
	Local variables:
	  X: 3
	Broken at FOO.
	(PRINT X) -
	3
	3
	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
     "foo/faa.lsp").

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

   - (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
     Stecklina).

   - 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,
     {ECHO,TWO-WAY}-STREAM-{INPUT,OUTPUT}-STREAM, FILE-STRING-LENGTH,
     INTERACTIVE-STREAM-P (dummy), STREAM-EXTERNAL-FORMAT.

   - 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
     CHANGE-CLASS, UPDATE-INSTANCE-FOR-{REDEFINED,NEW}-CLASS, and
     MAKE-INSTANCES-OBSOLETE.

   - 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.

   - Implemented WILD-PATHNAME-P, and LOAD-LOGICAL-PATHNAME-TRANSLATIONS
     (which similar to CMUCL looks for the translations at 
sys:host.translation).

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

   - 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.

From: Juan Jose Garcia Ripoll
Subject: Re: [ANN] ECL 0.9d released
Date: 
Message-ID: <2upmnbF2coduoU1@uni-berlin.de>
Stefan Ram wrote:
> Juan Jose Garcia Ripoll <·········@yahoo.de> writes:
> 
>>  - 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.
> 
> 
>   I have been looking for something like this, but here's
>   a problem: 
>   The doc-file "doc/ecldev/Inspecting-generated-C-code.html"
>   reads: [... some C code omitted...]
>   But when I try to do this, all I get is assembler code:
> 
> Top level.
> 
>>(defun add1 (x) (1+ x))
>>(disassemble *)
> 
> ;;; Loading #P"C:/R/s/ECL/cmp.fas"
> ;;; Loading #P"C:/R/s/ECL/sysfun.lsp"
> 
> Name:           ADD1
> Required:       X
> Documentation:  NIL
> Declarations:   NIL
>    0    PUSHV   1
>    2    CALLG   1,1+
>    5    EXIT
> NIL
> Top level.

Sorry, the documentation of the project is really out of date with the 
progress of the environment. The text that you read dates back to the 
time in which ECL did not have a bytecodes compiler. Now, every function 
which is defined in the command line is automatically turned into 
bytecodes (Not really assembler, but higher level instructions from 
ECL's virtual machine).

If you want to get the C code, you have to specify the function 
definition itself:

 > (disassemble (function-lambda-expression #'add1))
;;; Loading #P"/home/jlr/lib/ecl/cmp.fas"
;;; Loading #P"/home/jlr/lib/ecl/sysfun.lsp"

/*	local function CLOSURE                                        */
static cl_object LC1(cl_object V1)
{ VT2 VLEX2 CLSR2
	cl_object value0;
	{
	value0=one_plus(V1); NVALUES=1;
	return value0;
	}
}
NIL
Top level.

Or, equivalently, (disassemble '(ext:lambda-block ADD1 (x) (1+ x))), 
where LAMBDA-BLOCK is ECL's named lambda form.

Notice that ECL calls the function a "CLOSURE", but in practice it is 
not -- it has an empty environment and can be called directly.

Regards,

Juanjo
From: Juan Jose Garcia Ripoll
Subject: Re: [ANN] ECL 0.9d released
Date: 
Message-ID: <2uucolF2f0l1vU1@uni-berlin.de>
Stefan Ram wrote:
>   Actually, I want to get a standalone executable, and I'm still
>   having problems. 
>   I have tried to follow another help-HTML
>   "doc/ecldev/Compiler-examples.html".> 
>   I have created "hello.lsp" as suggested, and I have added gcc
>   to my path.
>>(compile-file "hello.lsp") [...]
> hello.c: In function `init_CODE':
> hello.c:19: error: `compiler_data_text' undeclared (first use in this function)

This is a bug from the 0.9c release. You are probably using the old, 
self-installing executable for Windows, which is still in the Webpage 
(under an older date than the 0.9d release!)

I still have not made a self-installing file for ECL 0.9d under Windows. 
You will have to wait, or compile it from sources -- which is not that 
hard if, as it seems, you already have mingw32.

Juanjo
From: Julian Stecklina
Subject: Re: [ANN] ECL 0.9d released
Date: 
Message-ID: <86652yooc1.fsf@goldenaxe.localnet>
···@zedat.fu-berlin.de (Stefan Ram) writes:

> Juan Jose Garcia Ripoll <·········@yahoo.de> writes:
>>I still have not made a self-installing file for ECL 0.9d under
>>Windows. You will have to wait, or compile it from sources --
>
>   Waiting might not help. I found the sentence:
>
>       "Building of binary distributions has been discontinued."
>
>   on the page
>
> http://ecls.sourceforge.net/ecl/user_1.html

This statement predates the Juan's announcement considerably. :)

Regards,
-- 
                    ____________________________
 Julian Stecklina  /  _________________________/
  ________________/  /
  \_________________/  LISP - truly beautiful