-* The EVAL-WHEN code has been rewritten to be ANSI-compliant, and
- various related bugs (IR1-1, IR1-2, IR1-3, IR1-3a) have gone away.
- Since the code is newer, there might still be some new bugs
- (though not as many as before Martin Atzmueller's fixes:-). But
- hopefully any remaining bugs will be simpler, less fundamental,
- and more fixable then the bugs in the old IR1 interpreter code.
-* The IR1 interpreter, byte compiler, and byte interpreter are gone.
- It's long been my plan to remove the IR1 interpreter while making
- EVAL-WHEN ANSI-compliant. It turned out that a cascade of changes
- caused by EVAL-WHEN ANSIness would have required fairly simple
- changes to the byte compiler; except they turned out to be quite
- difficult. This, plus the new familiarity with the byte compiler
- in general that I picked up as I worked on this specific problem,
- reduced my opinion of its maintainability enough that I deleted it
- instead of trying to fix it.
-* The compiler, especially the IR1 phase of the compiler, has been
- tweaked somewhat to support the new implementation of DEFUN and
- of the static linking hack used for cold init. In particular,
- the property of "is externally visible" is now orthogonal to
- the property of "is optimized/specialized for being called
- at LOAD time, with no arguments and no argument checking".
- The old FUNCTIONAL-KIND=:TOP-LEVEL type code which
- conflated these two properties has been replaced with the
- FUNCTIONAL-HAS-EXTERNAL-REFERENCES-P flag. This has minor
- beneficial consequences for the logic of #'CL:COMPILE and other
- things. Like the rewrite of EVAL, it has also quite possibly
- introduced some new bugs, but since the new logic is simpler and
- more orthogonal, hopefully it will be easier to clean up bugs
- in the new code than it was in the old code.
-* Some obscure compiler bugs (notably a messy one involving closures
- over variables when the closure relationship was stretched over
- multiple compilation components) were exposed by the new way that
- the compiler is used, and were fixed.
-* The revised compiler is still a little unsteady on its feet.
- In particular, the debugging information it produces is sometimes
- broken, and the support for inlining FOO when you
- (DECLAIM (INLINE FOO)) then do (DEFUN FOO ..) in a non-null
- lexical environment has been temporarily weakened (because the
- old clever code depended on correct debugging information).
-* There are new compiler optimizations for various functions: FIND,
- POSITION, FIND-IF, POSITION-IF, FILL, COERCE, TRUNCATE, FLOOR, and
- CEILING. Mostly these should be transparent, but there's one
- potentially-annoying problem (bug 117): when the compiler inline
- expands the FIND/POSITION family of functions and does type
- analysis on the result, it can find control paths which have
- type mismatches, and when it can't prove that they're not taken,
- it will issue WARNINGs about the type mismatches. It's not clear
- how to make the compiler smart enough to fix this in general, but
- a workaround is given in the entry for 117 in the BUGS file.
-* (Because of the interaction between the two previous items --
- occasional inlining problems and new inline expansions -- the
- new FIND, POSITION, FIND-IF, and POSITION-IF code won't really
- kick in properly until debugging information is straightened out
- in some future version.)
-* DEFSTRUCT and DEFCLASS have been substantially updated to take
- advantage of the new EVAL-WHEN stuff and to clean them up in
- general, and they are now more ANSI-compliant in a number of
- ways. Martin Atzmueller is responsible for a lot of this.
-* A bug in LOOP operations on hash tables has been fixed, thanks
- to a bug report and patch from Alexey Dejneka.
-* PPRINT-LOGICAL-BLOCK now copies the *PRINT-LINES* value on entry
- and uses that copy, rather than the current dynamic value, when
- it's trying to decide whether to truncate output . Thus e.g.
- (let ((*print-lines* 50))
- (pprint-logical-block (stream nil)
- (dotimes (i 10)
- (let ((*print-lines* 8))
- (print (aref possiblybigthings i) stream)))))
- should truncate the logical block only at 50 lines, instead of
- often truncating it at 8 lines.
-* Martin Atzmueller fixed several other bugs:
- ** correct ERROR type for various file operations
- ** removing dead code
-* Alexey Dejneka fixed many bugs, both classic bugs and bugs he
- discovered himself:
- ** misbehavior of WRITE-STRING/WRITE-LINE
- ** LOOP over keys of a hash table, LOOP bugs 49b and 81 and 103, and
- several other LOOP problems as well
- ** DIRECTORY when similar filenames are present
- ** DEFGENERIC with :METHOD options
- ** bug 126, in (MAKE-STRING N :INITIAL-ELEMENT #\SPACE))
- ** bug in the optimization of ARRAY-ELEMENT-TYPE
- ** argument ordering in FIND with :TEST option
- ** mishandled package designator argument in APROPOS-LIST
- ** various problems in the backquote readmacro
- He also pointed out some bogus old entries in BUGS, and fixed
- a number of bugs which came into existence in the pre7 branch
- (internal to the CVS repository), so that they never showed
- up in release versions.
-* :SB-CONSTRAIN-FLOAT-TYPE, :SB-PROPAGATE-FLOAT-TYPE, and
- :SB-PROPAGATE-FUN-TYPE are no longer considered to be optional
- features. Instead, the code that they used to control is always
- built into the system.
-* There are several incompatible changes:
- ** The old implementation of EVAL, has been largely discarded (as
- per the discussion of the "IR1 interpreter" above). In its place
- is code which still interprets a few special cases, but which in
- the general case calls COMPILE and then FUNCALLs the result.
- Besides the obvious changes in performance tradeoffs (that
- the cost per form passed to EVAL has gone up, and
- the cost per form executed by EVAL has gone down), this
- can be considered an "incompatible" change because there
- are no longer any interpreted function objects.
- COMPILED-FUNCTION-P is now synonymous with FUNCTIONP, and
- doing COMPILE on the output of interactive DEFUN is now a no-op.
+* compiler changes:
+ ** There are many changes in the implementation of the compiler.
+ SBCL is now essentially a compiler-only implementation of ANSI
+ Common Lisp. EVAL still "interprets" a few special cases, but
+ almost all the interesting cases are handled by creating
+ a LAMBDA expression, calling COMPILE on it, then calling
+ FUNCALL on the result.
+ ** The EVAL-WHEN code has been rewritten to be ANSI-compliant, and
+ various related bugs (IR1-1, IR1-2, IR1-3, IR1-3a) have gone away.
+ Since the code is newer, there might still be some new bugs
+ (though not as many as before Martin Atzmueller's fixes:-). But
+ hopefully any remaining bugs will be simpler, less fundamental,
+ and more fixable then the bugs in the old IR1 interpreter code.
+ ** The revised compiler is still a little unsteady on its feet.
+ In particular,
+ *** The debugging information it produces (particularly the names
+ of FUNCTION objects) is sometimes much less useful than what
+ the old compiler produced.
+ *** The support for inlining FOO when you (DECLAIM (INLINE FOO))
+ then do (DEFUN FOO ..) in a non-null lexical environment (e.g.
+ within a MACROLET) has been temporarily weakened.
+ ** There are new compiler optimizations for various functions:
+ *** the sequence functions FIND, POSITION, FIND-IF, POSITION-IF,
+ FIND-IF-NOT, POSITION-IF-NOT, and FILL
+ *** the math functions TRUNCATE, FLOOR, and CEILING
+ *** the function-of-all-trades COERCE
+ Mostly these should be transparent, but there's one
+ potentially-annoying problem (bug 117): when the compiler
+ inline-expands a function and does type analysis on the
+ result, it can find control paths which have type
+ mismatches, and when it can't prove that they're not taken,
+ it will issue WARNINGs about the type mismatches. This is
+ a particular problem in practice for the new sequence functions.
+ It's not clear how to make the compiler smart enough to fix
+ this in general, but a workaround is given in the entry for
+ 117 in the BUGS file.
+ ** (Because of the interaction between the two previous items --
+ occasional inlining problems and new inline expansions -- the
+ new sequence function optimizations won't really kick in
+ properly until debugging information is straightened out in
+ some future version.)
+* minor incompatible changes:
+ ** As part of a bug fix by Christophe Rhodes to DIRECTORY behavior,
+ DIRECTORY no longer implicitly promotes NIL slots of its
+ pathname argument to :WILD. In particular, asking for the
+ contents of a directory, which you used to be able
+ to do without explicit wildcards, e.g. (DIRECTORY "/tmp/"),
+ now needs explicit wildcards, e.g. (DIRECTORY "/tmp/*.*").
+ ** changes in behavior that ANSI explicitly defines to be
+ implementation dependent:
+ *** The new compiler-only implementation still conforms with ANSI,
+ but acts a little different. Besides the obvious changes in
+ performance tradeoffs (that the cost per form passed to EVAL
+ has gone up, and the cost per form executed by EVAL has gone
+ down), the behavior of the system changes a little because
+ there are no longer any interpreted function objects.
+ COMPILED-FUNCTION-P is now synonymous with FUNCTIONP, and
+ e.g. doing COMPILE on the output of interactive DEFUN is
+ now a no-op.
+ *** The value of INTERNAL-TIME-UNITS-PER-SECOND has been increased
+ from 100 to 1000.
+ *** The default for the USE list in MAKE-PACKAGE and DEFPACKAGE
+ has changed from (:CL) to NIL.
+ *** The CHAR-NAME of unprintable ASCII characters which, unlike
+ e.g. #\Newline and #\Tab, don't have names specified in the
+ ANSI Common Lisp standard, is now based on their ASCII symbolic
+ names (#\Nul, #\Soh, #\Stx, etc.) The old CMU-CL-style names
+ (#\Null, #\^a, #\^b, etc.) are still accepted by NAME-CHAR, but
+ are no longer used for output.
+ ** changes in internal implementation constants:
+ *** The default value of *BYTES-CONSED-BETWEEN-GCS* has doubled, to
+ 4 million. (If your application spends a lot of time GCing and
+ you have a lot of RAM, you might want to experiment with
+ increasing it even more.)