Lisp Machine System Release 97 Notes

19-Sep-83 01:15:58-EDT,817;000000000000
Return-path: <RMS@MIT-OZ>
Date: Monday, 19 September 1983, 01:11-EDT
From: Richard M. Stallman <RMS@MIT-OZ>
Subject: System 97 is now released.
To: info-lispm-mit@MIT-OZ

Documentation for System 97 is in OZ:SRC:<L.DOC>SYS97.MSG.
I have been using system 97 for a month, and it is pretty solid.
Make sure you use a band that uses microcode 257!
Good sources of these are CADR1 and CADR18.

The current version is 97.6.

The most interesting improvements are:

 A new Common-Lisp-compatible package system.

 An improved undo facility,
  the best an editor has ever had.

 Incremental band saving:
  save just the differences between your world
  and the system you loaded, in a small partition.

There are some incompatibilities, mostly due to Common Lisp,
 so make sure you read SYS97.MSG.

Notes on System 97.

System 97 comes with microcode 257.  It will not run with system 94 microcodes,
nor will microcode 257 run with systems before 97.  97 was initially released with
microcode 255, but 257 fixes an important bug and should be installed in all
system 97 bands.

All files must be recompiled in system 97 in order to work in system 97.
Files compiled in system 97 can usually be used in older system versions.
Problems are sometimes caused by the symbols which are global in 97
but not global in 94; see the end of the following page.

To debug a system 97 from another machine running system 94, you must
have patch 94.41 loaded.  97 can also debug 94.

Noteworthy Features.
  Selective Undo in ZWEI.
  Incremental band saving.
  New package system.

Incompatibilities Now.
     
     A] Package System Replaced.
     B] Case-Sensitive and -Insensitive String Comparison Functions.
     C] 'COMPILE No Longer Needed in PROGN.
     D] EVAL-WHEN Rationalized.
     E] TV:SHEET-FORCE-ACCESS Does Not Prepare the Sheet.
     F] Change to SI:FULL-GC-INITIALIZATION-LIST.
     G] Flushed Processes.
     H] PROGV With More Variables Than Values.
     I] New Global Symbols -- Backwards Compatibility Problems.

A] Package System Replaced.

There is now a new package system, essentially that of Common Lisp plus a few
compatibility features.  Its highlights are:

 Symbols in a package are now marked either internal or external.
 Only the external symbols are inherited by other packages.

 Packages are no longer arranged in a hierarchy; inheritance is no
 longer required to be transitive.  Now you can specify exactly which
 other packages' external symbols are to be inherited by a new package.

 KEYWORD and USER are now two distinct packages.  No symbol is shared
 between KEYWORD and GLOBAL, so that COMPILE and :COMPILE are two
 distinct symbols, and so are NIL and :NIL.  Your code must now be
 careful to use the correct symbol (keyword or global) in all such cases,
 where it used to make no difference.

For full details, see the file SYS: DOC; CLPACK TEXT.  It should be noted
that similar changes will probably be in the next Symbolics release.

B] Case-Sensitive and -Insensitive String Comparison Functions.

The function EQUAL now considers the strings "A" and "a" to be distinct.
Use EQUALP if you wish to ignore case in the comparison.
This is a Common Lisp change.

CHAR-EQUAL and STRING-EQUAL always ignore case.
To consider case in comparing characters or strings this way,
use = for characters and the new function STRING= for strings.

SAMEPNAMEP now considers case significant.

The functions of the STRING-SEARCH series now take an extra optional
argument which says whether to consider case.

The old flag ALPHABETIC-CASE-AFFECTS-STRING-COMPARISON is now used
only by the %STRING-SEARCH and %STRING-EQUAL microcode primitives.
These primitives now consider font significant as well as case when the
flag is non-NIL.

C] 'COMPILE No Longer Needed in PROGN.

Any PROGN encountered at top level by the compiler is now handled
by treating each element as if it had been found at top level.
Macros that used to expand into (PROGN 'COMPILE forms...)
can now expand into just (PROGN forms...)

This is a Common Lisp change.

D] EVAL-WHEN Rationalized.

The treatment of (EVAL-WHEN (LOAD) forms...) by the compiler is now
identical to the treatment of forms encountered with no EVAL-WHEN.  They are
put into the file to be evaluated on loading, or compiled if they are DEFUNs,
and any macros defined are made available for expansion during the compilation.

As a consequence, you can no-op an EVAL-WHEN by supplying (LOAD EVAL)
as its first argument.  It is then equivalent in all cases to no EVAL-WHEN at all.

Nested EVAL-WHENs now effectively intersect their list of times to evaluate.
As a result,
   (EVAL-WHEN (COMPILE LOAD EVAL)
     compile-time-forms...
     (EVAL-WHEN (LOAD EVAL)
       forms...))
treats the forms in the ordinary manner, overriding the special treatment
given to the compile-time-forms.
   (EVAL-WHEN (COMPILE) (EVAL-WHEN (LOAD) ignored-forms...))
does not do anything with the ignored-forms.

Please let me know if this causes any problem.

E] TV:SHEET-FORCE-ACCESS Does Not Prepare the Sheet.

The macro TV:SHEET-FORCE-ACCESS (documented in the window system manual)
used to put a TV:PREPARE-SHEET into its expansion unless an optional argument
was supplied to inhibit doing so.

It turned out that most uses of the macro had no need to prepare the sheet but
were neglecting to supply the optional argument.  Since combining the
two facilities is unmodular, the prepare-sheet has simply been flushed from
TV:SHEET-FORCE-ACCESS.  If you really want to do one, simply write a
TV:PREPARE-SHEET explicitly in the body of the TV:SHEET-FORCE-ACCESS.

The old optional dont-prepare-flag argument is still accepted but has no effect now.

F] Change to SI:FULL-GC-INITIALIZATION-LIST.

The SI:FULL-GC-INITIALIZATION-LIST initializations are now run
before the garbage collection in SI:FULL-GC, rather than after.
A new initialization list, SI:AFTER-FULL-GC-INITIALIZATION-LIST,
is run after.  The old list which now runs before GC can be requested
with the keyword :FULL-GC in ADD-INITIALIZATION, and the
new list which runs after can be requested with :AFTER-FULL-GC.

This change is for greater compatibility with Symbolics systems.

G] Flushed Processes.

A flushed process now has the symbol SI:FLUSHED-PROCESS
as its wait function.  This function is equivalent to FALSE in that
it always returns NIL, but it is distinguishable from FALSE.
Thus, flushed processes can reliably be distinguished from
those that have done PROCESS-WAIT-FOREVER.

H] PROGV With More Variables Than Values.

The function PROGV accepts a list of variables and a list of values.
In the past, if the list of variables was longer, NIL was used in place of the
missing values.  Now, in this case, the extra variables which have no corresponding
values will be made "unbound".  This is a Common Lisp change.

I] New Global Symbols -- Backwards Compatibility Problems.

The many new global symbols present in system 97 for Common Lisp
do not require changes in programs unless you are already using
the same names for other things, but they sometimes cause
trouble for compiling a file in system 97 and loading it in system 94.

For example, in system 97, the symbol PATHNAME is global.  If your
code refers to FS:PATHNAME (the base flavor of pathnames), when
it is read into system 97 during compilation this will get the global
symbol.  The QFASL file thus produced will not say "package FS" for
that symbol, because the distinction no longer exists.  If the QFASL
file is then loaded into system 94, it will refer to a symbol PATHNAME
in whatever package you are loading into.  This will not be the same symbol
as FS:PATHNAME, so the program will not work.

Most problems of this sort can be fixed by INTERNing the intended symbol
in the package you are loading into.  In the above example, doing
    (INTERN 'FS:PATHNAME 'mypackagename)
before loading the file would make it work.  You would probably do this
in the file containing the PACKAGE-DECLARE.  It will have no effect
when loading into system 97.

Incompatibilities Coming In Future Systems.
     
     A] Decimal Radix Will Become the Default.
     B] Row-Major Order of Array Indices.
     C] The Flag Bit Will Cease to Exist.
     D] COMPILER:RETURN-FROM-T May Go Away.
     E] Bit Fields in Character Codes May Be Rearranged.

A] Decimal Radix Will Become the Default.

In some future system, base 10. will become the default.  This is a Common Lisp
change.  However, it will still be possible to specify the radix for each file
individually.  To avoid any difficulties, place Base: 8; in the attribute list (the
-*- line) of any file which is supposed to be in octal.

B] Row-Major Order of Array Indices.

Arrays are currently stored in column-major order, but for Common Lisp it is
necessary to store them in row-major order.  This change is likely to happen
in the next system released after 97.  For more details on how to ride this change
conveniently, see section 8.8 of the Lisp Machine manual.

C] The Flag Bit Will Cease to Exist.

In a future version of the system, there will not be a flag bit.
This is to enable pointers to be 25 bits long.
If you use the flag bit, you should start converting now to stop using it.

D] COMPILER:RETURN-FROM-T May Go Away.

If you have macros that produce expansions that use COMPILER:RETURN-FROM-T,
you should start changing them to expand into BLOCKs instead.  BLOCK is a new
Common Lisp control construct, described in detail below.  You can use a
gensym BLOCK name to avoid any possibility of interference with the code in
which the macro is used.

E] Bit Fields in Character Codes May Be Rearranged.

This will probably not require you to change your code, if you refer
to characters only through standard byte pointers such as %%KBD-CONTROL and
standard types of character naming such as #\Control-F, but it will require
recompilation of all files that contain codes for control characters.

Compatible Programming Changes:
     
     A] Many New Global Symbols.
     B] New Macro PUSHNEW.
     C] Common Lisp Control Constructs BLOCK and TAGBODY.
     D] LEXPR-FUNCALL And APPLY Now Synonymous.
     E] :ALLOW-OTHER-KEYS Special Keyword for &KEY Arguments.
     F] Character Objects Exist.
     G] READING-FROM-FILE, READING-FROM-FILE-CASE Special Forms.
     H] New Function FS:EXTRACT-ATTRIBUTE-BINDINGS.
     I] GET Accepts Third Argument.
     J] Common Lisp Numeric Functions.
     K] CHAOS:SEND Is No More.
     L] New Function DEFF-MACRO.
     M] Named Structure Operation :FASLOAD-FIXUP.
     N] FUNCALLing a Named Structure.
     O] Note on DEFSELECT and Named Structures.
     P] TV:MAKE-WINDOW Now Identical to MAKE-INSTANCE.
     Q] Window Manual Error: TV:MOUSE-WAKEUP and TV:MOUSE-RECONSIDER.
     R] Delaying Flavor Recompilation.
     S] :INSTANCE-AREA-FUNCTION Flavor Keyword.
     T] %PAGE-STATUS Change.
     U] Testing Values for Pointerhood.
     V] Infix Expressions.
     W] EH:REQUIRE-PDL-ROOM.
     X] Rubout Handler Option :DONT-SAVE.
     Y] New Host Operation :NETWORK-ADDRESSES.
     Z] Error in Manual: SI:FILE-INPUT-STREAM-MIXIN.
     AA] New Error Condition SYS:NO-SERVER-UP.
     BB] New Function CHAOS:UP-HOSTS.
     CC] GET and GETHASH with Three Arguments.
     DD] New Macro TYPECASE.

A] Many New Global Symbols.

The file SYS: DOC; CLISP-GLOBAL-SORTED TEXT contains a list of many
symbols inserted in the GLOBAL package because they are standard
Common Lisp constructs.  Some of them have been defined already
in system 97; more will be defined as patches, and others in the next system.

B] New Macro PUSHNEW.

    (PUSHNEW elt list)

is equivalent to

    (OR (MEMQ elt list)
        (PUSH elt list)

C] Common Lisp Control Constructs BLOCK and TAGBODY.

BLOCK takes a block name and a body:

    (BLOCK name body...)

and executes the body, while allowing a RETURN-FROM name to be used within
it to exit the BLOCK.  If the body completes normally, the values of the last
body form are the values of the BLOCK.

A BLOCK whose name is NIL can be exited with plain RETURN, as well as with
RETURN-FROM NIL.

BLOCK can be thought of as the essence of what named PROGs do, isolated and
without the other features of PROG (variable binding and GO tags).

Every function defined with DEFUN whose name is a symbol contains an automatically
generated BLOCK whose name is the same as the function's name, surrounding the
entire body of the function.

TAGBODY, on the other hand, is the essence of GO tags.  A TAGBODY form contains
statements and tags, just as a PROG's body does.  A symbol in the TAGBODY form is
a tag, while a list is a statement to be evaluated.  The value returned by a
TAGBODY is always NIL.  TAGBODY does not have anything to do with RETURN.

PROG is now equivalent to a macro

    (MACRO PROG (FORM)
	(LET* ((NAME (AND (SYMBOLP (CADR FORM)) (CADR FORM)))
		 (VARS (IF NAME (CADDR FORM) (CADR FORM)))
		 (BODY (IF NAME (CDDDR FORM) (CDDR FORM))))
	  (IF NAME
		`(BLOCK ,NAME
		   (BLOCK NIL
		     (LET ,VARS
			 (TAGBODY . ,BODY))))
	    `(BLOCK NIL
		 (LET ,VARS
		   (TAGBODY . ,BODY))))))

if we ignore the added complication of PROGs named T and RETURN-FROM-T.

D] LEXPR-FUNCALL And APPLY Now Synonymous.

APPLY now accepts any number of arguments and behaves like LEXPR-FUNCALL.
LEXPR-FUNCALL with two arguments now works the way APPLY used to, passing
an explicit rest-argument rather than spreading it.  This eliminates the old
reasons why LEXPR-FUNCALL was not the best thing to use in certain cases,
and paves the way for APPLY to translate into it.

E] :ALLOW-OTHER-KEYS Special Keyword for &KEY Arguments.

When a function whose argument list includes &KEY is called, if the keyword arguments
passed include the keyword :ALLOW-OTHER-KEYS with a non-NIL value, then any
unrecognized keywords present in the argument list will not be an error.
You do not have to do anything in the function definition to make :ALLOW-OTHER-KEYS
work.

For example,

    (DEFUN FOO (&KEY A B) (LIST A B))
    (FOO ':A 3 ':B 4 ':C 5 ':ALLOW-OTHER-KEYS T)
       ; The ':C and its value are ignored
       ; rather than causing an error.

It does not matter where among the keywords the :ALLOW-OTHER-KEYS is found.

F] Character Objects Exist.

A new data type, DTP-CHARACTER, has been created for character objects.  These
print out as things like #/A for the character A.  This printed representation
can be read back in.  Note that this is not the same as the Common Lisp printed
representation for characters; that cannot be used in Zetalisp because it is
already defined and means something else.  Zetalisp and Common Lisp syntax
differ in a number of other ways as well.  When Common Lisp syntax is
provided, in another system version this fall, Zetalisp syntax will remain available
and will be the same as it is now.

Characters can be used in arithmetic like fixnums, and compared
like fixnums.  (= 101 #/A) is T, but (EQUAL 101 #/A) is NIL.
EQUALP when comparing two characters ignores case, so that
(EQUALP #/A #/a) is T.

Characters can also be used to index arrays, just like fixnums,
and can be printed out on windows and to files.

Characters evaluate to themselves.

G] READING-FROM-FILE, READING-FROM-FILE-CASE Special Forms.

These two special forms are a straightforward aid in writing code that reads Lisp
forms from a file, while obeying the attribute list of the file.  (The attribute list
file's pathname object or generic pathname object is not updated with this 
special form.)

The following form prints out the result of evaluating each form in the file:

  (FS:READING-FROM-FILE (FORM FILE)
     (FORMAT T "Values from ~S are: " FORM)
     (FORMAT:PRINT-LIST T "~S" (MULTIPLE-VALUE-LIST (EVAL FORM))))

FS:READING-FROM-FILE-CASE is a cross between FS:READING-FROM-FILE and
WITH-OPEN-FILE-CASE, except there's an additional argument error for use
in the clauses.

   (FS:READING-FROM-FILE-CASE (FORM FILE ERROR)
       ((FS:FILE-NOT-FOUND
          (FORMAT T "~&Options file ~A not found, using default values." FILE))
        (FS:FILE-ERROR
	     (FORMAT T "~&Error: ~A" (SEND ERROR ':REPORT-STRING)))
        (:NO-ERROR (PROCESS-OPTION FORM))))

There must be a :NO-ERROR clause.

H] New Function FS:EXTRACT-ATTRIBUTE-BINDINGS.

FS:EXTRACT-ATTRIBUTE-BINDINGS stream
   returns two values: a list of variables, and a corresponding list of values to bind them to,
   to set up an environment to read data from stream in accordance with stream's attribute list.

I] GET Accepts Third Argument.

    (GET symbol property default-value)

returns default-value if the requested property is not present.

J] Common Lisp Numeric Functions.

Nearly all the Common Lisp numeric functions, with the exception of transcendental
functions with complex arguments or values, are now implemented.

Two remaining exceptions:
   // still truncates fixnums, and you must still use
   %DIV to divide and make a rational from them.

   REM still is and will remain a function for nondestructive removal
   of elements from a list, rather than a numeric remainder function.

K] CHAOS:SEND Is No More.

The symbol CHAOS:SEND no longer exists; SEND used to be shadowed in the
CHAOS package, but it isn't anymore.  CHAOS:SEND did not have a definition,
value, or properties for quite a while.

L] New Function DEFF-MACRO.

DEFF-MACRO "e function-spec &eval definition
  defines function-spec as definition, just like DEFF.
  The difference comes in compiling a file, where the compiler assumes
  that DEFF-MACRO is defining a macro and makes the definition available
  for expansion during this compilation.  DEFF, on the other hand, is just
  passed through to be evaluated when the file is loaded.
  To use DEFF-MACRO properly, definition must be a list starting with
  MACRO or a suitable subst function (a list starting with SUBST or a
  compiled function which records an interpreted definition which is
  a list starting with SUBST).

M] Named Structure Operation :FASLOAD-FIXUP.

The named structure operation :FASLOAD-FIXUP is invoked by FASLOAD whenever
a named structure is created according to data in a QFASL file.  This operation
can do whatever is necessary to make the structure properly valid, in case just
reloading it with all its components is not right.  For most kinds of structures,
this operation need not do anything; it is enough if it does not get an error.

N] FUNCALLing a Named Structure.

You can now funcall a named structure to invoke a generic operation on it,
just as you would a flavor instance.  In fact, you can have code which operates
on named structures and flavor instances indiscriminately, if you make sure
that the named structures you are using support whichever operations you
plan to use.

For example,
    (FUNCALL PACKAGE ':DESCRIBE)
invokes the :DESCRIBE operation on the current package, just as
    (NAMED-STRUCTURE-INVOKE ':DESCRIBE PACKAGE)
would do.

This has not been made ultra-fast, but that can be done in a future
microcode release once all the machines have the full control memory plugged in.

O] Note on DEFSELECT and Named Structures.

DEFSELECT, by default, defines the function to signal an error if it is called
with a first argument not defined in the DEFSELECT (except for :WHICH-OPERATIONS,
which is defined implicitly by DEFSELECT).

If you use DEFSELECT to define the handler function for a named structure type,
and you use this default behavior, you will get errors at times when the system
invokes operations that you may not know or care about, such as :SXHASH or
:FASLOAD-FIXUP.

To avoid this problem, specify IGNORE as the default handler in the DEFSELECT.
IGNORE accepts any arguments and returns NIL.

P] TV:MAKE-WINDOW Now Identical to MAKE-INSTANCE.

Windows can now be created with MAKE-INSTANCE just like any other flavor instances.
The function TV:MAKE-WINDOW will be supported indefinitely since it is so widely used.

Q] Window Manual Error: TV:MOUSE-WAKEUP and TV:MOUSE-RECONSIDER.

The window manual says that you should call the function TV:MOUSE-WAKEUP to
report a change in screen configuration.  This is not exactly true.

The function TV:MOUSE-WAKEUP causes the mouse process to look again at the
position of the mouse.  It is called by the function TV:MOUSE-WARP, so that the
mouse will be tracked to its specified new position.  It is also the thing to use if
you redisplay a menu-like window with a new set of menu items, for example,
so that the mouse process will notice whether the mouse position is now inside a
different menu item.

However, actual changes in the window configuration may make it necessary to
force recomputation of which window owns the mouse.  This is done by setting
the variable TV:MOUSE-RECONSIDER non-NIL.  Calling TV:MOUSE-WAKEUP may not
be enough, since the current mouse position may still be inside the old screen
area of a no-longer-eligible window.

R] Delaying Flavor Recompilation.

Normally the system recompiles combined methods automatically when
you make a change that requires this.  If you plan to make more than one change,
you might wish to recompile only once.  To do this, set the variable
SI:*DONT-RECOMPILE-FLAVORS* non-NIL before you make the changes.
Then set it back to NIL, and use RECOMPILE-FLAVOR to perform
the appropriate recompilations.

S] :INSTANCE-AREA-FUNCTION Flavor Keyword.

You can now control which area flavor instances are consed in, on a per-flavor basis,
by giving a flavor an instance-area function.  This is a function which will be
called whenever the flavor is instantiated, and expected to return the area to
cons in (or NIL, if it has no opinion).  The function is passed one argument,
the init-plist, so if you want to have an init option for the caller to specify the
area, the instance-area function can use GET to get the value the caller specified.

The instance-area function is specified with

     (:INSTANCE-AREA-FUNCTION function)

in the flavor definition, and it is inherited by flavors which use this one
as a component.

T] %PAGE-STATUS Change.

The subprimitive %PAGE-STATUS now returns the entire first word
of the page hash table entry for a page, if the page is swapped in;
or NIL for a swapped-out page, or for certain low-numbered areas
(which are all wired, so their pages' actual statuses never vary).
The argument is an address in the page you are interested in--data type is irrelevant.
The %%PHT1- symbols in SYS: SYS; QCOM LISP are byte pointers
you can use for decoding the value.

U] Testing Values for Pointerhood.

%POINTERP object
  returns non-NIL if object points to storage.  For example,
  (%POINTERP "FOO") is T, but (%POINTERP 5) is NIL.

%P-POINTERP location
  returns non-NIL if the contents of the word at location points to storage.
  This is similar to (%POINTERP (CONTECTS location)), but the latter may get
  an error if location contains a forwarding pointer, a header type, or an
  unbound marker.  In such cases, %P-POINTERP will correctly tell you whether
  the header or forward points to storage.

%P-POINTERP-OFFSET location offset
  similar to %P-POINTERP but operates on the word offset words beyond location.

%P-CONTENTS-SAFE-P location
  returns non-NIL if the contents of word location are a valid Lisp object, at least
  as far as data type is concerned.  It is NIL if the word contains a header type,
  a forwarding pointer, or an unbound marker.  If the value of this function is
  non-NIL, you will not get an error from (CONTENTS location).

%P-CONTENTS-SAFE-P-OFFSET location offset
  similar to %P-CONTENTS-SAFE-P but operates on the word offset words beyond location.

%P-SAFE-CONTENTS-OFFSET location offset
  returns the contents of the word offset words beyond location as accurately as
  possible without getting an error.

  If the data there are a valid Lisp object, it is returned exactly.
  If the data are not a valid Lisp object but do point to storage,
  the value returned is a locative which points to the same place in storage.
  If the data are not a valid LIsp object and do not point to storage,
  the value returned is a fixnum with the same pointer field.

%POINTER-TYPE-P data-type
  returns non-NIL if the specified data type is one which points to storage.
  For example, (%POINTER-TYPE-P DTP-FIX) returns NIL.

V] Infix Expressions.

You can now include infix expressions in your Lisp code.
For example,
   #X:Y+CAR(A1[I,J])
is equivalent to
   (SETQ X (+ Y (CAR (AREF A1 I J))))

# begins an infix expression, and  ends it.

The atomic terms of infix expressions include

      symbols: use \ to quote special characters.

      numbers: any valid Lisp real or imaginary number is accepted.
        Complex numbers can be constructed by addition or subtraction.

      strings: the same as in ordinary Lisp syntax.

      raw Lisp data: ! followed by any Lisp expression, as in
          # FOO . !(CAR BAR)   =>  (LIST* FOO (CAR BAR))

Combining operations:

Highest precedence
	a [ i ]	(AREF a i)
	a [ i, j ]	(AREF a i j)		and so on
  examples
	X[I,J+3]   =>   (AREF X (+ J 3))
      (GET-MY-ARRAY(FOO))[I]   =>   (AREF (GET-MY-ARRAY FOO) I)

	f ( a )	(f a)
	f ( a, b )	(f a b)		and so on
  examples
	CAR(X)   =>   (CAR X)

	( exp )	exp			parentheses control order of evaluation.
  examples
	(X+1)*Y   =>   (* (+ X 1) Y)

	( e1, e2 )	(PROGN e1 e2)	and so on
  examples
	(X:5, X*X)   =>   (PROGN (SETQ X 5) (* X X))

	[ elt ]	(LIST elt)
	[ e1, e2 ]	(LIST e1 e2)		and so on
  examples
	[!'X,Y,Z]   =>   (LIST 'X Y Z)

Precedence 180 on left, 20 on right
	a : b	      (SETF a b)
  examples
	X: 1 + Y: Z+5   =>   (SETQ X (+ 1 (SETQ Y (+ Z 5))))

Precedence 140
	a ^ b	      (EXPT a b)		right associative
  examples
	X ^ N ^ 2   =>   (EXPT X (EXPT N 2))

Precedence 120
	a * b	      (* a b)
	a * b * c	(* a b c)		and so on
	a / b	      (// a b)
	a / b / c	(// a b c)		and so on

Precedence 100
	- a		(- a)
	a + b	      (+ a b)
	a + b + c	(+ a b c)		and so on
	a - b	      (- a b)
	a - b - c	(- a b c)		and so on

Precedence 95
	a . b	      (LIST* a b)
	a . b . c	(LIST* a b c)	and so on
	a @ b	      (APPEND a b)
	a @ b @ c	(APPEND a b c)	and so on

Precedence 80
	a  b	      (MEMQ a b)
	a = b	      (= a b)
	a = b = c	(= a b c)		and so on
        <, >, , ,  are like =.

Precedence 70
	NOT a	      (NOT a)

Precedence 60
	a AND b		(AND a b)
	a AND b AND c	(AND a b c)	and so on

Precedence 50
	a OR b			(OR a b)
	a OR b OR c		(OR a b c)	and so on

Precedence 45 for c, 25 for a and b.
	IF c THEN a		(IF c a)
	IF c THEN a ELSE b 	(IF c a b)

It is easy to define new operators.  See SYS: IO1; INFIX LISP.

W] EH:REQUIRE-PDL-ROOM.

EH:REQUIRE-PDL-ROOM regpdl-space specpdl-space
  makes the current stack group larger if necessary, to make sure that
  there are at least regpdl-space free words in the regular pdl, and at
  least specpdl-space free words in the special pdl, not counting what
  is currently in use.

X] Rubout Handler Option :DONT-SAVE.

If you specify a non-NIL value for the :DONT-SAVE option when
you invoke the rubout handler, then the input string read will not
be saved on the input ring for the Control-C command.

This feature is used by YES-OR-NO-P so that the Yes or No
does not get saved.

Y] New Host Operation :NETWORK-ADDRESSES.

The operation :NETWORK-ADDRESSES, on a host object, returns an alternating
list of network names and lists of addresses, such as
    (:CHAOS (3104) :ARPA (106357002))
You can therefore find out all networks a host is known to be on, etc.

Z] Error in Manual: SI:FILE-INPUT-STREAM-MIXIN.

The flavor documented in the manual as SI:FILE-INPUT-STREAM-MIXIN
is actually called SI:INPUT-FILE-STREAM-MIXIN.  Similarly, what is described
as SI:FILE-OUTPUT-STREAM-MIXIN is actually called SI:OUTPUT-FILE-STREAM-MIXIN.

AA] New Error Condition SYS:NO-SERVER-UP.

The error condition SYS:NO-SERVER-UP is signaled by certain requests for
a service from any available network host, when no suitable host is currently
available.

BB] New Function CHAOS:UP-HOSTS.

CHAOS:UP-HOSTS host-list &optional number-of-hosts (timeout 250.)
  returns a list of all the hosts in host-list which are currently accessible
  over the chaos network.  host-list is a list of host names and/or host objects.
  The value is always a list of host objects, possibly NIL for none of them.

  If number-of-hosts is non-NIL, it should be a positive integer; when that
  many hosts have responded, CHAOS:UP-HOSTS returns right away without
  bothering to listen for replies from the rest.

  timeout is how long it takes, without response, to decide that a host is down.

CC] GET and GETHASH with Three Arguments.

GET and GETHASH now take an optional third argument, which is a default value
to be returned as the value if no property or hash table entry is found.

DD] New Macro TYPECASE.

There is now a TYPECASE macro, compatible with Common Lisp.

Miscellaneous User Interface Changes
     
     A] Incremental Bands.
     B] Evaluation in the Debugger.
     C] Beep Types.
     D] Terminal T Change.
     E] New Function SI:VIEW-UNFINISHED-PATCHES
     F] VMS Default Device.
     G] Improved File Error Handling.
     H] Some Functions' Keyword Args Missing in ARGLIST.
     I] Evaluating/Compiling Multi-Font Files.

A] Incremental Bands.

You can now save disk space when you save a band containing your favorite
programs by making an incremental band; that is, a band which contains the
differences between the Lisp world you want to save and another band (the one
you originally loaded).

To do this, provide a non-NIL third argument to DISK-SAVE, as in
    (DISK-SAVE "LOD4" NIL T)
It takes a couple of extra minutes to find what pages need to be saved.
You can restore the incremental band with DISK-RESTORE or boot it like
any other band.

Booting or restoring an incremental band works by first booting the original band
and then copying in the differences that the incremental band records.  This
takes only a little longer than booting the original complete load band.

The original band to which an incremental band refers must be a complete load.
When you update a standard system band (loading patches, for instance) you
should always make a complete load, so that the previous system band is not
needed for the new one to function.

The incremental band contains the partition name of the original band;
DESCRIBE-PARTITION prints it out for you.  That original band must still exist,
with the same contents, in order for the incremental band to work properly.  The
incremental band contains error check data used to verify this.  The error
checking is done by the microcode when the incremental band is booted, but it
is also done by SET-CURRENT-BAND, so that you will not be permitted to make an
incremental band current if it is not going to work.

B] Evaluation in the Debugger.

When you evaluate an expression in the debugger, it is evaluated in the
binding environment of the frame that is current in the debugger.

Initially, the debugger starts out with its current frame being the one in which
the error happened.  Therefore, your expressions are evaluated in the environment
of the error.  However, you now have the option of evaluating them in other
environments instead.

The debugger command Meta-S is no longer necessary in most cases, since simply
evaluating the special variable will get the same result.  But it is still useful with
a few variables such as STANDARD-INPUT and EH:CONDITION-HANDLERS which are
rebound by the debugger for your protection when you evaluate anything.

C] Beep Types.

The system now supplies a non-NIL beep-type to the function BEEP on certain
occasions.  These are the types defined so far:

ZWEI:CONVERSE-PROBLEM
  Used for the beep that is done when Converse is unable to send a message.
ZWEI:CONVERSE-MESSAGE-RECEIVED
  Used for the beeps done when a Converse message is received.
ZWEI:NO-COMPLETION
  Used when you ask for completion in the editor and the string does not complete.
TV:NOTIFY
  Used for the beep done when you get a notification that cannot 
  be printed on the selected window.

Those of you who redefine BEEP can use the beep type (the first argument)
to produce different sounds for different occasions.  More standard beep types
will be defined in the future, if users suggest occasions that deserve beep types.

D] Terminal T Change.

Terminal T now controls just the deexposed Typeout action of the selected
window.  A new command Terminal I controls the deexposed type-In action.
(Sadly, Terminal O is already in use).

Terminal 0 T -- just wait for exposure on output when deexposed.
Terminal 1 T -- notify user on attempt to do output when deexposed
Terminal 2 T -- permit output when deexposed.

Terminal 0 I -- just wait for exposure on input when deexposed.
Terminal 1 I -- notify user on attempt to do input when deexposed
Terminal 2 I -- There is no Terminal 2 I.  It doesn't make sense.

E] New Function SI:VIEW-UNFINISHED-PATCHES

SI:VIEW-UNFINISHED-PATCHES &optional (system "System") (stream STANDARD-OUTPUT)
prints out the unfinished patches of the system onto stream.

F] VMS Default Device.

The "primary device" for VMS hosts is now USRD$ rather than SYS$SYSDSK.

G] Improved File Error Handling.

When there is an error accessing a file and the system asks for a new pathname,
you now have the option of entering the debugger instead.  Simply type End.

H] Some Functions' Keyword Args Missing in ARGLIST.

Calling ARGLIST on certain functions will omit the list of their keyword args.
This is due to a compile bug when they were compiled.  If you think you have
come across such a function, report it and it will be corrected with a patch.

I] Evaluating/Compiling Multi-Font Files.

It now works to evaluate or compile files that contain multiple fonts
as specified with the Fonts attribute in the -*- line.  The old kludge
that some users used for doing this should no longer be used.

To make this work in all cases, user-defined readmacro characters should do all
input using the function SI:XR-XRTYI (see its on-line documentation).  You may
wish to specify arguments of stream NIL T.

Note that if a readmacro detects a syntax error and wants to report this by
signaling an Lisp error, it should always make SYS:READ-ERROR one of the
condition names and provide the proceed-type :NO-ACTION, which should
be handled by skipping over the invalid data and returning something (NIL
is a reasonable thing to return).

Editor and ZMail Changes
     
     A] Selective Undo.
     B] Control-Shift-D Command Changed.
     C] New Dired Command on < Key.
     D] ZMail Can Generate Message-ID Fields.
     E] New ZMail Command M-X Undigestify Message.
     F] VMS Mail Files Understood.

A] Selective Undo.

You can now undo an editing change that is not the most recent change you made.
If you give the Undo command C-Shift-U while there is a region, it undoes
the most recent batch of changes that falls within the region.  The region does
not go away, so you can repeat the command to undo successive changes
within the same region.  For example, you can undo your changes to a
specific Lisp function by using C-M-H to create a region around it
and then using C-Shift-U.

B] Control-Shift-D Command Changed.

The command Control-Shift-D now prints the full documentation of the
function which point is inside a call to.  Control-Shift-D is thus analogous to
Control-Shift-A.  Meta-Shift-D is still available if you wish to specify the
function to be documented.

C] New Dired Command on < Key.

A new command to edit the superior directory of the current buffer's directory
can be found on the < key in DIRED.

D] ZMail Can Generate Message-ID Fields.

If you want, ZMail can put a Message-ID field in your outgoing messages.  Go into
the Profile editor to get this behavior, because the default is not to generate
Message-ID fields.

E] New ZMail Command M-X Undigestify Message.

This command takes the current message and splits it into its submitted messages
so that you can act on them individually.  You can set aspects of what the command
does by using the Profile editor:

   (1) Should the original message be deleted ? (Default: Yes)
   (2) Should everything but the header and ``table of contents'' be clipped out of
        the original message ?  (Default: No)
   (3) Should the name of the digest be append to the subject field of all the new 
       messages so that you can tell from which digest they came ?  (Default:Yes)

F] VMS Mail Files Understood.

ZMail can now read and write VMS format mail files, as used at MIT.


Last modified: 2021/08/24 14:29:11 (UTC) by ams