========================== 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 compile-time warning. - Destructive functions like NREVERSE whose results are not used will produce a compile-time 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: * IEEE-style floating point behavior is not supported: - signed zeroes exist but arithmetic operations may not produce the correct signed zeroes. - 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.) * 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, applying the result of integer-decode-float to scale-float does not 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. A few random spot checks were done for each function and maxima was used to verify the results. * 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. The double-double version of pi is EXT:DD-PI. * There may be 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 which functions 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 without 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 ) 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. * Trac Tickets 3. without-package-locks doesn't work with defmacro - DEFMACRO within a WITHOUT-PACKAGE-LOCKS now actually disables the package lock. 4. symbol-macrolet + ignorable causes internal compiler error - IGNOREing a symbol in a SYMBOL-MACROLET doesn't cause a type error anymore. 5. Hash table entry with key and value of :EMPTY is treated as an empty entry. - :EMPTY is allowed now and works as expected. 6. 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. 7. 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. - An SCM and project management system is now available at http://trac.common-lisp.net/cmucl. Please use this to submit tickets, documentation, project requests, etc. * 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 for download information, guidelines on reporting bugs, and mailing list details. We hope you enjoy using this release of CMUCL!