T 2.8 release notes 25 April 1984 ------------------- This is the file "//bronto/t/t2.8/doc/release_notes"@YALE-RING.ARPA. There are no major incompatibilities between versions 2.7 and 2.8. Most users should have no problem switching versions, and should not even have to recompile anything. -------------------- Incompatible changes: - LAMBDA-bindings no longer shadow syntax table entries in the standard compiler. Evaluation semantics are now consistent between standard compiler and TC. The semantics are consistent with the manual, but not with T 2.7 in which TC complied with the manual but the standard compiler did not. Example: (LET ((SET LIST) (X 5)) (SET X 8)) => 8 ; not (5 8) [However, this doesn't mean that the LAMBDA-binding has no effect; merely that it's not recognized as such when the name appears in the car of a form. (LET ((SET LIST) (X 5)) ((BLOCK SET) X 8)) => (5 8) ] This is not a final decision! There are two camps on this issue, and they are still at war. This was the easiest semantics to implement, and it is consistent with the documentation. But the other side may win in the future. - (SET (P X Y ...) VAL) now expands into (LET (( VAL)) ((SETTER P) X Y ... VAL) ) This is consistent with the manual, but inconsistent with T 2.7. It has two consequences: (a) SET-expressions now return the RHS of the assignment, not what the SETTER procedure returns. (b) The RHS is now evaluated BEFORE any of the subforms of the LHS. This will cause incompatible behavior where interacting side-effects are involved. - Read macro procedures now take three arguments instead of two. The first two arguments are as before; the third is the read table from which the procedure was fetched (i.e. the one that was originally passed to READ-OBJECT). Read macros which recursively invoke the reader will want to pass that read table as the second argument to READ-OBJECT. Note that (SET (READ-TABLE-ENTRY ...) PROC) will convert PROC from a two-argument procedure to a three-argument procedure which ignores its third argument. This is a hack intended to ease the transition from 2.7 to 2.8; old read macros should continue to work. This hack will be removed in some future version of T. - TC no longer has its own definition of COND. If no clause is selected, then an undefined value is returned, and that value will no longer be (). If you are still hacking **NO-MORE-COND-CLAUSES** after all these years, your code will stop working. The correct thing to do, if you want the fall-through case for COND to yield false (as in other Lisp dialects), is to set up your own definition of COND. There is a new feature which makes this almost pleasant (see paragraph beginning "the evaluation semantics...," below). If you would like advice on how to do this, contact me (Rees@Yale). - The environment used by "#." has changed. "#." is not released, so if you're curious about what it does now, look at the sources. -------------------- New features: - A new inspector command (L) will print the values of all lexically apparent variables out to the nearest locale. This is appropriate to use when the current object is a stack frame or closure. (Works only with "interpreted" code.) - Read macro procedures now take a read table argument. See above. - There is read syntax for true and false objects now: #F reads in as a false object, and #T reads in as a true object. (TRUE? '#T) => true (FALSE? (CAR '(#F #T))) => true Note that thee objects do not necessarily self-evaluate! (LIST #F #T) is not defined, and is probably a syntax error. (LIST '#F '#T) => (#F #T) - LET-SYNTAX now exists, as documented in the 4th edition manual. - The evaluation semantics have been extended to allow the evaluation of forms whose cars are syntax descriptors. Such a form is interpreted just as if it were a form whose car was a symbol whose syntax table entry was the syntax descriptor. E.g. (DEFINE-LOCAL-SYNTAX (FOO X) `(,(SYNTAX-TABLE-ENTRY *STANDARD-SYNTAX-TABLE* 'LAMBDA) () ,X)) ((FOO 5)) => 5 What good is this? you might well ask. It allows control over binding time for reserved words. E.g. a macro such as FOO, above, can be sure that its expansion will be treated as an expression evaluating to a closure, regardless of what the syntax table entry for the symbol LAMBDA is when the expansion is evaluated or otherwised analyzed. If this doesn't make sense to you, then you can probably get by without making use of this feature. - There are now "hash-on-EQ" tables. The interface is very simple right now, but it may become more featureful in the future. (MAKE-TABLE identification) -> table (TABLE-ENTRY table key) -> value or false For example: (DEFINE Z (MAKE-TABLE 'Z)) (TABLE-ENTRY Z 'FOO) => false ;Nonexistent entry (SET (TABLE-ENTRY Z 'BAR) 15) (TABLE-ENTRY Z 'BAR) => 15 These act something like a-lists and something like property lists. A key or value may be any object. The comparison in the lookup is EQ?. - ASH now works on large positive integers. (Still fails to work on negative numbers with magnitudes > 2^28.) - Compatible structure type redefinition is no longer deliterious to old instances of the type. A redefinition is "compatible" if the selectors have the same names in the same order. - There is an improved floating-point number printer, which prints using the fewest possible number of characters. Thanks to the Spice Lisp people at CMU for this code. WARNING: it is slow, and conses a lot. If you print many floating point numbers, you may want to do the following: (SET (*VALUE *T-IMPLEMENTATION-ENV* '*PRINT-FLONUMS-KLUDGILY?*) T) which tells the system to use the old printer. - Characters without standard graphics or names will now read and print as #[Ascii 237]. The old syntax #[Char 237] will continue to work for now, for compatibility. - Unix T now supports "-h" (heap) and "-l" (leave) command line switches, for better control over the address space. E.g. t -h 2000000 # Start up a T with 2 meg heaps t -l 1000000 # Start up a T, leaving 1 meg available for non-T stuff - T now runs under Unix 4.2BSD. - New HERALD item, (SUPPORT ...), and routines in TC for manipulating support environments. Not yet documented. -------------------- Bug fixes: - Syntax tables and environments are now decoupled. If you work at it, you can, e.g., have a variable named LAMBDA which doesn't shadow the syntax table entry for LAMBDA. Also, STANDARD-COMPILER and RUN-COMPILED-CODE behave in a manner which more closely resembles correctness. ENV-SYNTAX-TABLE is no longer a no-op. - The bignum division routine has been rewritten, and has a better chance of being correct. - ->INTEGER can now convert floating point numbers outside of the fixnum range. - FS-NAME is now available, as documented in the manual. - WHERE-DEFINED now returns the source file's filename instead of the object file's filename. - Tracing operations should work now. - REQUIRE now interacts more or less correctly with the new filespec syntax. (Sorry, I still consider REQUIRE to be unreleased - use at your own risk.) - A GC bug in Aegis T wherein strings longer than 32759 characters caused horrible problems, has been fixed. - Fatal errors are handled a little more gracefully now in Aegis T. "DQ -S" should succeed now where it didn't in 2.7. - Fixed the age-old Aegis T startup problem with "relocation errors." It should be okay now to start up T in an "un-fresh" process. - Unix T no longer interferes with the C runtime library's storage arena. -------------------- Internal improvements (of interest only to those who hack the system internals - contact the T implementors for details, if you care): - There is a HERALD parser. - There is a division routine yielding quotient and remainder. - "nlist" is now accessible, so it will be easier to dynamically load foreign code on Unix. - There is a way for a macro expander to obtain the syntax table with respect to which the macro form is being expanded. This will permit reliable macro expansion of subforms. - VAX T has byte vectors. - STREAM-FILENAME operation. - LOAD-STREAM procedure, loads code from given stream. - Backquote works a little differently now. - *PRINT-TABLE* now guides the action of the printer. (This will change in the future to eliminate all such global state.) Many internal reader/printer changes. *OUTPUT-RADIX* is defunct; look at the source for FORMAT to see how to bind the output radix. - The implementation of locales and variable lookup has changed somewhat.