wiki:Release19d
close Warning: Can't synchronize with repository "(default)" ("(default)" is not readable or not a Git repository.). Look in the Trac log for more information.

========================== C M U C L 19 d =============================

The CMUCL project is pleased to announce the release of CMUCL 19d. This is a major release which contains numerous enhancements and bugfixes from the 19c release.

CMUCL is a free, high performance implementation of the Common Lisp programming language which runs on most major Unix platforms. It mainly conforms to the ANSI Common Lisp standard. CMUCL provides a sophisticated native code compiler; a powerful foreign function interface; an implementation of CLOS, the Common Lisp Object System, which includes multimethods and a metaobject protocol; a source-level debugger and code profiler; and an Emacs-like editor implemented in Common Lisp. CMUCL is maintained by a team of volunteers collaborating over the Internet, and is mostly in the public domain.

New in this release:

  • Feature enhancements:
    • Destructive functions like nreverse that modify constant args will produce a warning.
    • Destructive functions like nreverse whose results are not used will produce a warning.
    • Pathnames that cannot be printed readably using #p"..." will now be printed using the CMUCL extension #P(...). However, there are still cases where CMUCL cannot print pathnames readably, but these involve search-lists and patterns.
    • LONG-LONG and UNSIGNED-LONG-LONG are recognized types in the C-CALL package for signed and unsigned 64-bit integers.
    • A port of gencgc to Darwin/ppc has been made. This still needs work, and is known to have some issues, but it compiles CMUCL without problems and runs maxima just fine.
    • TRACE supports tracing of FLET/LABELS functions. Use (trace (labels foo bar)) to trace the labels function FOO in the function BAR. This is currently experimental.
    • DISASSEMBLE will disassemble flets/labels functions when disassembling a function. Set disassem::*disassemble-flets* to NIL to turn this off.
    • Simple errors in socket handling code have been converted to socket-error's to allow easier distinction of the errors.
    • EXT:LOAD-FOREIGN will use dlopen to try to open a shared library, so if dlopen searches in certain places, LOAD-FOREIGN will find the shared object.
    • A new search-list "ld-library-path:" has been created and contains the value of the environment variable LD_LIBRARY_PATH. This is analogous to the "path:" search-list.
    • When a core file is started, any shared libraries that were loaded when the core was made will be reloaded on startup. If the library cannot be found, several restarts are available.
    • Support for the new float type EXT:DOUBLE-DOUBLE-FLOAT. This includes support for complex numbers with this component type and simple arrays for this type and complex numbers of this type.
      • A DOUBLE-DOUBLE-FLOAT uses two DOUBLE-FLOAT's to represent a number with >= 106 bits of precision (about 33 digits).
      • Known issues:
        • If you are expecting IEEE-style behavior, you don't get it:
          • signed zeroes aren't really available.
          • overflows don't return infinity but return NaN instead.
          • rounding might not be quite the same as IEEE
          • SQRT is not accurate to the last bit, as required by IEEE.
        • Multiplying by a number very close to most-positive-double-float will produce an error even if the result does not overflow. (This is an artifact of how multiplication is done. I don't have a solution to this.)
        • Read/write consistency is not working. (Because conversion from a bignum to a double-double-float doesn't really understand the internal double-double-float format.)
        • INTEGER-DECODE-FLOAT and SCALE-FLOAT aren't "inverses". That is, you can't take the result of integer-decode-float and use scale-float to produce exactly the same number. This is because of how bignums are converted to double-doubles.
        • FLOAT-DIGITS always returns 106 even though there could be more bits. (Consider the double-double (1d0,1d-200)). This will show up in PRINT where the printed result will have way more than the normal 33 digits or so. But reading such a number back won't give the same value.
        • There is probably more consing than is necessary in many of the standard Common Lisp functions like floor, ffloor, etc.
        • The special functions are not fully tested. I did a few random spot checks for each function and compared the results with maxima to verify them.
        • The branch cuts for the special functions very likely will not match the double-float versions, mostly because we don't have working signed zeroes.
        • Type derivation for double-double-floats might not be working quite right.
        • PI is still a double-float. If you want a double-double version of pi, it's KERNEL:DD-PI. (Soon to be EXT:DD-PI.)
        • There are probably still many bugs where double-double-float support was overlooked.
        • The double-double arithmetic operations can be inlined by specifying (SPACE 0). Otherwise, they are not inlined. (Each double-double operation is about 20 FP instructions.)
    • Hash tables now support weak value, weak key-and-value, and weak key-or-value tables. The :WEAK-P keyword argument can take the following values with the given meanings:

T

For backward compatibility. It is the same as :KEY.

:KEY

The entry exists as long as the key is not garbage-collected.

:VALUE

The entry exists as long as the value is not garbage-collected.

:KEY-AND-VALUE

The entry exists as long as the key and the value are alive.

:KEY-OR-VALUE

The entry exists as long as the key or the value are alive.

These tables are currently experimental, but appear to work.

  • TRACE supports an extra option, :WHEREIN-ONLY. This is similar to the :WHEREIN option, except :WHEREIN-ONLY only traces the function if the immediate caller is the specified function(s).
  • Numerous ANSI compliance fixes:
    • A reader-error is signaled if the number that is being read is too small to be presented. We used to silently return 0.
    • WITH-INPUT-FROM-STRING no longer modifies the index if WITH-INPUT-FROM-STRING is not exited normally.
    • An error is signaled if a declaration is used as the name of a deftype, condition, or defstruct, and vice versa.
    • An error is signaled when trying to generate a namestring from a pathname with just a version component (other than nil, :newest, or :unspecific). CMUCL cannot print that readably.
    • FLET and LABELS functions will catch errors in keyword parameters. Previously, a keyword of NIL was silently accepted.
    • Printing a zero using ~E will now include a trailing zero after the decimal point, as required by CLHS, 22.3.3.2.
    • DOCUMENTATION and (SETF DOCUMENTATION) now works for structures of type list or vector.
    • DOTIMES will execute the loop the specified number of times, independent of what the loop might do to the loop counter.
    • Printing of circular objects using logical-blocks is handled better.
    • SET-SYNTAX-FROM-CHAR copies the entire dispatch table of reader macro functions if necessary.
    • SET-SYNTAX-FROM-CHAR handles single-escape, multiple-escape and # characters correctly now.
    • When CLOSE'ing a file with :ABORT, don't delete the file, unless we renamed it. This preserves any and all changes to the file, instead of deleting it.
    • As specified by CLHS 22.1.3.1.3, PRIN1 and friends now produce a trailing zero if necessary.
    • As specified by CLHS 22.3.3.2, ~E will produce a single zero for the fractional part, if necessary.
    • (FORMAT NIL "~,2F" 0.001) produces "0.00" instead of "0.001". Thus, we actually honor the d field now.
  • Numerous bugfixes:
    • LISTEN on DUAL-CHANNEL-SIMPLE-STREAM should work now.
    • Some numerical issues with the two-arg log function have been fixed. (log 17 10f0), (log 17f0 10) and (log 17 10) all return the same result now.
    • DESTRUCTURING-BIND no longer causes an error when the list to be destructured is circular.
    • PEEK-CHAR for Gray streams handles end of file correctly now.
    • For the ppc port, the alignment of objects in alien structures now matches the PowerOpen? ABI for Mac OS X.
    • For Darwin/ppc, CMUCL was not following the ABI when calling out to C varargs functions. Now we always copy any float args to the corresponding int regs (or stack) as required by the ABI. This isn't necessary for non-varargs functions, but CMUCL doesn't know functions which are varargs functions.
    • Callbacks with long-long args or results should work correctly now for Darwin/ppc.
    • DESCRIBE no longer depends on having PCL loaded.
    • Tracing with no encapsulation appears to be working now for ppc.
    • A simple interface to sysinfo(2) has been added for sparc. This is used to provide better values for MACHINE-TYPE and MACHINE-VERSION.
    • PARSE-TIME can parse times like "Tue Sep 7 18:56:57 UTC 2004" again.
    • The pretty-printer for MULTIPLE-VALUE-BIND can handle malformed MULTIPLE-VALUE-BIND forms now, instead of producing an error.
    • Callbacks on Darwin/ppc with a large number of args (more than 8 integer args) should work correctly now. (Previous versions would signal an error.)
    • DESCRIBE no longer says arrays are adjustable when they are not, and vice versa.
    • Disassembly of some floating-point instructions on ppc has been corrected to display floating-point registers instead of integer registers.
    • (read (make-array 5)) doesn't cause a segfault anymore on x86/linux. An error is now signaled saying the object isn't one of the possible stream types.
    • The PPC port no longer runs very slowly on some tests on a G5. This was caused by using an instruction (mcrxr) that is emulated on a G5 but not earlier.
    • The pretty printer no longer causes an error on badly formed slots in defclass forms.
    • Document LISP::*IGNORE-WILDCARDS*. When set, namestrings will not have pathnames with wildcards escaped when parsing namestrings or when creating namestrings.
    • Fix PPC bug in fixnum arithmetic that caused overflow. A trap would be triggered, but there's no C support for the trap.
    • Some flet/labels functions were not disassembled at all.
    • (expt 1 <big number>) doesn't trigger a continuable error anymore and returns 1 immediately.
    • Disassembling methods doesn't produce a type error anymore.
    • The unknown condition type 'LISP:SOCKET-ERROR has been fixed. It properly signals the EXT:SOCKET-ERROR condition now.
    • The accuracy of the trig functions (sin, cos, tan) for large arguments has been improved for x86 and ppc. Sparc already had accurate versions. Thus, (cos 1d120) is -0.8278608682708728d0.
    • ROOM works a bit better with GENCGC's allocation because unallocated pages ended up looking like pages of conses.
    • DESCRIBE will indicate if a hash-table is a weak (key) hash-table or not.
    • Some issues with GC of weak pointers and weak hash-tables have been fixed. (CMUCL would sometimes crash to ldb about weird, invalid objects.) There are, however, still issues with weak pointers.
    • Hash table entries with a key and value of :EMTPY now work as expected.
    • EXT:READ-VECTOR can read binary data from streams with element type BASE-CHAR or CHARACTER.
  • Trac Tickets
    1. without-package-locks doesn't work with defmacro
      • DEFMACRO within a WITHOUT-PACKAGE-LOCKS now actually disables the package lock.
    2. symbol-macrolet + ignorable causes internal compiler error
      • IGNOREing a symbol in a SYMBOL-MACROLET doesn't cause a type error anymore.
    3. Hash table entry with key and value of :EMPTY is treated as an empty entry.
      • :EMPTY is allowed now and works as expected.
    4. GCed items in weak hash tables are still accessible (with random junk)
      • When an entry is freed in a weak hash-table, the entry is actually marked as free now. Previously, MAPHASH and WITH-HASH-TABLE-ITERATOR would still display (potentially incorrect) entry for it.
    5. Bug in ext:read-vector
      • Fixed so that EXT:READ-VECTOR can read binary data from streams with element type BASE-CHAR and CHARACTER. This matches the behavior of STREAMS:READ-VECTOR.
  • Other changes:
    • CMUCL catches more cases where it cannot print a pathname readably. In particular when the pathname name contains "/" or ".", or when the pathname type contains a ".".
    • WITH-SLOTS and WITH-ACCESSORS are now pprinted like MULTIPLE-VALUE-BIND instead of like WITH-OPEN-FILE.
    • LOOKUP-HOST-ENTRY now returns a second value. If LOOKUP-HOST-ENTRY succeeds, the second value is T; otherwise, the value of h_errno is returned.
    • A warning is printed when creating a weak key hash table with a test different from EQ.
  • Improvements to the PCL implementation of CLOS:
  • Changes to rebuilding procedure:
    • Build scripts should recognize FreeBSD automatically.
    • Should be able to build on either Mac OS X 10.2 or 10.4 using the default version of gcc.

This release is not binary compatible with code compiled using CMUCL 19c; you will need to recompile FASL files.

See <URL:http://www.cons.org/cmucl/> for download information, guidelines on reporting bugs, and mailing list details.

We hope you enjoy using this release of CMUCL!

Last modified 10 years ago Last modified on 09/03/14 04:23:01