[Ecls-list] GCL test suite && more fixes

Juan Jose Garcia Ripoll worm at arrakis.es
Mon Mar 10 02:32:03 UTC 2003


Thanks Paul for your wonderful test suite. It really saves one a lot of work! 
There are things, though, which I fail to understand, such as (PROGN) => NIL 
instead of (PROGN) => (VALUES). The first option is listed only in the 
HyperSpec as "Example", but I could not deduce it from the text :-/

Anyway, the test suite has inspired a lot of changes in ECL. I also used this 
chance to rewrite part of the interpreter, opening the code of several 
functions inside the single interpret() loop.

Remember, that the CVS HEAD is only for the adventorous (The stable release 
remains tagged as ECL_0_8), and in particular the following changes were made 
by a man with a terrible flu :-) Have fun!

Juanjo

* Errors fixed:

  - The compiler had wrong type information about CHAR-NAME &
    NAME-CHAR.

  - DOTIMES fails with negative bignums and floats.

  - LOAD-TIME-VALUE should be a special operator.

  - COPY-SYMBOL fails with uninterned symbols.

  - GENSYM and GENTEMP failed if the suffix becomes a bignum.

  - COMPILE has to generate libraries with different names for each
    function. Otherwise, when compiling a second function, the
    dlopen() loader will not load the library because it thinks it has
    it already in memory.

  - When a compound form consists only of a string, this string should
    not be interpreted as a documentation string, but as a form.

  - SYMBOL-MACROLET definitions were ignored by GET-SETF-EXPANSION.

  - DESTRUCTURING-BIND fails to interpret &WHOLE arguments.

* Errors of the interpreter:

  - CASE should use EQL to compare objects, not EQ.

  - Empty PROGN and implicit PROGNs (LAMBDA, etc) should output NIL
    instead of (VALUES). Similarly, a CASE with no matching clause
    should also output NIL.

  - A NIL in the keys position of a CASE clause can never match
    anything: (CASE () (NIL 'A) (T 'B)) => B

  - SETQ can only output one value

  - User could not have a keyword variable with name ALLOW-OTHER-KEYS,
    as in (LAMBDA (&KEY ALLOW-OTHER-KEYS) (PRINT ALLOW-OTHER-KEYS)).

* Visible changes:

  - Function definitions from the interpreter are now remembered by
    default. This means you can now type
	     (DEFUN MY-FUNCTION (X) (COS X))
    and later on
	     (COMPILE 'MY-FUNCTION)
    If you want to save memory, use this to forget these definitions
	     (SETQ SI::*KEEP-DEFINITIONS* NIL)

  - New function SI:MKSTEMP creates an totally new empty file by
    appending a 6-characters prefix to a template supplied by the
    user.

  - COMPILE now creates all temporary files in the directory pointed
    to by the environment variable TMPDIR (Or /tmp if none). It also
    uses MKSTEMP to produce unique file names, and solve the problem
    that dlopen() cannot reload two libraries with the same name.

* ANSI compatibility:

  - INVOKE-DEBUGGER now uses the value of *DEBUGGER-HOOK*.

  - Implemented LEAST-*-NORMALIZED-*-FLOAT.

  - WITH-PACKAGE-ITERATOR implemented. LOOP clauses which iterate over
    the symbols of a package now work. Furthermore, LOOP... FOR
    PRESENT-SYMBOL... now iterates both over internal and external
    symbols, just to be conformant with other implementations.

  - COMPILE should output three values: the function itself, plus two
    flags indicating the existence of errors.

  - CONSTANTP takes two arguments, the second being an environment.

  - Implemented FUNCTION-LAMBDA-EXPRESSION (Replaces non-standard
    SI::COMPILED-FUNCTION-SOURCE).

  - Right evaluation order enforced in PUSH, PUSHNEW, PSETQ.

  - In FUNCALL, the interpreter evaluated the function form *after*
    the arguments.

  - (SETF #:GXXX), where #:GXXX is any uninterned symbol, should be a
    valid function name.





More information about the ecl-devel mailing list