[Ecls-list] Bunch of fixes

Juan Jose Garcia Ripoll worm at arrakis.es
Mon Mar 17 02:38:09 UTC 2003


Hi,

it seems the 0.9 release will have the largest amount of fixes ever. I have 
been working last night with Paul F. Dietz' test suite, and discovered a 
couple of memory leaks, one race condition, and had time to implement some 
missing ANSI features (like *print-readably* and others). Since the amount of 
changes is too large, I simply put the latest version of the CHANGELOG 
(includes previously mentioned fixes).

Have fun!

Juanjo

* Errors fixed:

  - The PCL relied on the compiler to optimize certain method
    combinations. However, the native compiler is not always present,
    and therefore it is safer to use interpreted functions instead.

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

  - The compiler might get into an infinite loop when dealing with
    compiler-macros.

  - When the functions/macros in a DLL are no longer used, and the
    garbage collector notices this, the library is properly deallocated.

  - BIT-* fails when the input is made of arrays with rank <> 1.

  - A few leaks from ECL's original garbage collector have been
    fixed. Thus, the option "--disable-boehm" at configuration time is
    again active.

  - When returning from a function, the values are stored in the
    VALUES() array. This process has to be "atomic", in the sense that
    no lisp function (cl_*, si_*, bytecodes) may be called, because
    they also try to overwrite these values. This requirement was not
    accomplished by the previous inliner.

  - CCASE forms would output no value.

  - Tags in TAGBODY should be compared with EQL so that a bignums may
    tags (Two bignums which are EQL may be not EQ!).

  - Various errors in STRING-TRIM* and *CAPITALIZE.

  - Wrong type information about NAME-CHAR, CHAR-NAME and DIGIT-CHAR
    lead to compilation errors.

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

  - Excesive arguments to NOT or NULL were not detected.

* Visible changes:

  - No "Bye" message in QUIT.

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

  - The interpreter now detects syntax errors in function calls: such
    as in (setq a ("foo")).

* ANSI compatibility:

  - WITH-HASH-TABLE-ITERATOR implemented.

  - In DEFGENERIC, only SPACE and SPEED declarations were allowed.

  - The bytecodes compiler did not contemplate the possibility of
    a lambda list with &key and no keyword variables.

  - In MAKE-PATHNAME, values which are supplied (even if NIL), are not
    overwritten by the :DEFAULTS. For instance, (MAKE-PATHNAME :TYPE
    NIL :DEFAULTS "FOO.LISP") => #P"FOO"

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

  - Symbol GC moved from the COMMON-LISP package, to SI and CL-USER.

  - DELETE-PACKAGE turns a package into an illegal object. Thus, if a
    reference to the package is around, this may cause problems.

  - *CASE and *TYPECASE now use condition & restarts for signaling errors.

  - Restarts may be associated to conditions. WITH-CONDITION-RESTART
    implemented.

  - *COMPILE-FILE-{PATHNAME,TRUENAME}* defined and used.

  - All package function now signal errors of type
    PACKAGE-ERROR. Also, when trying to operate on a locked package
    (See SI::PACKAGE-LOCK), a correctable error is signaled.

  - Errors in LOOP macro are signaled as PROGRAM-ERROR.

  - When a LOOP has a NAMED sentence, no enclosing NIL block is
    produced. Furthermore, the blocks always surround the whole of the
    code, so that (LOOP FOR A IN (RETURN :GOOD)) works.

  - Character names ("Return", "Tab", etc) now have the right case.

  - CHAR/= and CHAR-NOT-EQUAL require at least one character.

  - Implemented *PRINT-READABLY*, and the condition PRINT-NOT-READABLY.

  - Implemented type EXTENDED-CHAR.





More information about the ecl-devel mailing list