Lisp Machine System Release 87 Notes

System 87 comes with microcode 164.  It does not run with previous microcodes.
Microcode 164 will work with system 86, however.

There are no major incompatibilities between systems 86 and 87.

OZ is now the default host for bug reports, and is also the associated
machine for all the machines which used to have AI.

Programming changes:

   [1] A new system for read-time and run-time conditionalization.
   [2] Array reference functions.
   [3] Changes in hash tables.
   [4] Changes in areas and explicit freeing of storage:
   [5] :MINI-BUFFER-OR-READLINE is now allowed as a type for FQUERY.
   [6] YES-OR-NO-P and Y-OR-N-P now print (Y or N) or (Yes or No).
   [7] The function for reading a file attribute list from a stream is now
       called FS:READ-ATTRIBUTE-LIST.
   [8] New function FS:CREATE-DIRECTORY to create a directory on a file
       server.
   [9] New function FS:REMOTE-CONNECT performs the Twenex CONNECT or
       ACCESS operations, as far as access control is concerned.
   [10] ZWEI:FIND-FILE now returns the buffer containing that file.
   [11] A new type of method, the :AROUND method, has been defined.
   [12] DOLIST and DOTIMES can return values.
   [13] New conditional form SELECT-MATCH.
   [14] **MORE** processing and typeout windows.
   [15] WHEN and UNLESS.
   [16] Changes in SXHASH.
   [17] Transcendental functions of small flonums
   [18] LET-GLOBALLY works on initially-unbound variables.

[1] A new system for read-time and run-time conditionalization for
different systems and sites has been contributed by Symbolics.

Read time conditionalization of an expression is done by writing
#+feature expression or #-feature expression.  The former causes
expression to be read in only if feature is present; the latter, only if
feature is absent.  This much is the same as before.  What is changed
is which features you can test in this way.

The features you can test for now include the types of systems (MIT and
SYMBOLICS) and the types of network software (CHAOS and ETHER).

You can no longer use a read-time conditional to test for a particular
site.  Instead, you should use a run-time conditional on the value of
the variable SITE-NAME, which will be a symbol in the keyword package:
:MIT if you are running at MIT.

The motivation for this is that you will probably have to recompile your
files anyway to move to a different type of system, but ordinarily the
same compiled files will run at any site.  So read-time conditionals,
which are checked only when a file is compiled, not when it is run,
bring no extra problems if they are used for different system types,
but should not be used for distinguishing sites.

[2] Array reference functions:

Array references are now faster.  Also, ALOC and AP-1, etc., will no
longer examine the contents of the slot you are getting a locative to.
This prevents spurious errors.

There are new array functions AR-1-FORCE, AS-1-FORCE and AP-1-FORCE
that read, set or get a locative to an array element using a single
subscript regardless of the rank of the array.  This is equivalent
to making a one-dimensional indirect array pointing to the original array
and indexing through that; but much faster and without consing.

ARRAY-RANK is a new name for ARRAY-/#-DIMS

[3] Changes in hash tables:

EQUAL and EQ hash tables are now nearly the same kind of object,
and are accessed using the same functions.

You still use MAKE-EQUAL-HASH-TABLE to make an EQUAL hash table and
MAKE-HASH-TABLE to make an EQ hash table, but from then on you use the
same functions (GETHASH, PUTHASH, etc) for both of them.  The old function
names for EQUAL hash tables, GETHASH-EQUAL and so on, still exist as synonyms
for the other names.

A new function, MAPHASH-RETURN, maps a function over the items in a hash table
like MAPHASH, and returns a list of all the values returned by the function.
So MAPHASH-RETURN is to MAPHASH as MAPCAR is to MAPC.

The arguments to MAPHASH-RETURN are a function and a hash table.
Each time the function is called, its arguments are one hash key
and the associated value or values stored in the hash table.

[4] Changes in areas and explicit freeing of storage:

RESET-TEMPORARY-AREA is only allowed on areas that have
been marked as "temporary".  You mark an area as temporary by calling
MAKE-AREA-TEMPORARY on the area number, or by specifying ':GC ':TEMPORARY
in MAKE-AREA.  If you reset a non-temporary area, you get an error.
If you continue, with Resume, the area is marked temporary for you.

RETURN-ARRAY has been renamed to RETURN-STORAGE.  It will now return
the storage of any type of object.

It is now possible to grow an area to be more than half of the address space.
In more detail, an area for which no maximum size was specified (and
which therefore has the largest positive fixnum as its maximum size)
is now allowed to grow without limit.

[5] :MINI-BUFFER-OR-READLINE is now allowed as a type for FQUERY.
It behaves just like the type :READLINE, except that if used inside
the editor, it uses a minibuffer to read in the line.

[6] YES-OR-NO-P and Y-OR-N-P now by default list the choices you can type:
either Y or N, or Yes or No.  This is a change in the first argument which
those functions pass to FQUERY.  Some old calls to Y-OR-N-P or YES-OR-NO-P
may include "(Y or N)" or something similar as part of the prompt string.
They should be changed.

[7] The function for reading a file attribute list from a stream is now
called FS:READ-ATTRIBUTE-LIST, for compatibility with brand S.
This was called FS:FILE-READ-PROPERTY-LIST in system 79, and was
FS:FILE-READ-ATTRIBUTE-LIST in system 86.  Both old names will continue to work.

[8] The function FS:CREATE-DIRECTORY takes a pathname specifying a directory,
and an optional keyword arg :ERROR (default T), and creates a directory
on a file server.  This is implemented in the Twenex file server.

[9] The function FS:REMOTE-CONNECT takes a pathname specifying a directory,
and two optional keyword arguments :ERROR (default T) and :ACCESS (default NIL),
and tells the file server (on the host specified in the pathname)
to do a Connect or an Access to the device/directory specified in the
pathname.  You will be asked for a password if one is needed.
Passwords are remembered once specified, unless you have turned off
that feature for login passwords.  In addition, your connected or accessed
directory is remembered even if the file server connection is deleted
for lack of use.

Note that this operation only affects access control.  The file server's
connected directory is never used by system 86 or 87 to deteremine
what file you will get.  If you wish to "connect" to specify a default,
you should instead use the "working directory" feature, which does the same
job but operates entirely within the Lisp machine and works uniformly for
all types of file servers.  See item [a], below.

[10] ZWEI:FIND-FILE now returns the buffer containing that file (after
reading the file in if necessary).  This is useful if you give NIL as a
second argument, meaning don't select the buffer.

[11] A new type of method, the :AROUND method, has been defined.  An
:AROUND method specifies code to be executed around the execution of the
other methods.  In this respect it is like a wrapper.  However, a
wrapper is a kind of macro; it computes code to be executed later.  The
:AROUND method is an ordinary function, executed at run time, like most
other methods.

:AROUND methods are executed base flavor innermost, interspersed with any
wrappers.  If one flavor provides both a wrapper and a :AROUND method, the
:AROUND method goes inside.

An :AROUND method receives three special arguments, which come before the
arguments actually passed in the message.  These are customarily called
continuation, data1 and data2.

continuation is a function, like a combined method, which calls the
remaining methods.  data1 is the mapping table for continuation to use.
data2 is just the message being processed -- a list of all the arguments
sent to the flavor instance, starting with the operation name.

The :AROUND method does (AROUND-METHOD-CONTINUE continuation data1 data2)
to call the continuation and pass it the same arguments that were supplied.
When the continuation returns to the :AROUND method, it can do additional work.
The :AROUND method can propagate the values returned by the continuation, or
it can return its own values.

In a sense, data2 is redundant, in that you could construct it yourself
from the individual arguments to the :AROUND method.  The list is passed
separately as a convenience.  Sometimes it is useful to pass the
continuation slightly modified arguments.  This is done by writing
(FUNCALL-WITH-MAPPING-TABLE continuation data1 'operation any-other-args...)
where you must use the individual arguments of the :AROUND method to make
up the remaining args.  LEXPR-FUNCALL-WITH-MAPPING-TABLE also exists.

Here is an :AROUND method example

(defmethod (shift-lines-left-mixin :draw-line) (continuation mapping-table ignore
								from-x from-y to-x to-y
								&rest pass-along)
  (lexpr-funcall-with-mapping-table continuation mapping-table
						(1+ from-x) from-y
						(1+ to-x) to-y
						pass-along))

This mixin, combined into a window flavor, would cause lines drawn with
the :DRAW-LINE operation to come out one pixel to the left of where they
normally would.

Definitions of DEFWHOPPER, CONTINUE-WHOPPER and LEXPR-CONTINUE-WHOPPER
in terms of :AROUND methods are provided for compatibility with brand S.

[12] DOLIST and DOTIMES can now return values on normal termination.

In (DOTIMES (counter maximum value-expression) body), when the value of
counter reaches that of maximum, value-expression is evaluated and its
value(s) returned.  Previously, DOTIMES always returned NIL.

The same feature is available in DOLIST.
(DOLIST (variable list value-expression) body) returns the value(s) of
value-expression when list is exhausted.

[13] A new conditional form SELECT-MATCH is installed.
This was invented by AGRE, who called it SELECTP.
It resembles SELECT, except that each clause can specify a pattern
to match the select-value against.

The syntax is
   (SELECT-MATCH object
     (pattern condition sexp ... sexp)
     (pattern condition sexp ... sexp)
     ...
     (pattern condition sexp ... sexp)
     (OTHERWISE sexp ... sexp))

The value of object is matched against the pattern's one at a time until a
match succeeds and the accompanying condition evaluates to something
non-null, at which point the sexp's associated with the pattern and
condition are evaluated one at a time and the last value is returned.  The
pattern's can be arbitrary s-expressions, with variables signified by
#?variable.  When the pattern is matched against the object's value, the
variables are to bound to their matched values.  Different occurences of the
same variable in a given pattern must match to the same thing, so that

    (SELECT-MATCH '(A B C)
      ((#?X B #?X) T 'LOSE)
      ((#?X B #?Y) T 'WIN)
      (OTHERWISE 'LOSE-BIG))

returns WIN.  The variables mentioned in the pattern's need not be bound by
the user; they are bound by the expression resulting from the expansion of the
macro.  (The variable #?IGNORE matches everything and doesn't become bound.
Using #?IGNORE for a variable you don't intend to make any use of avoids
"bound but not used" warnings from the compiler.)

[14]  **MORE** processing and typeout windows.

A typeout window now shares a single **MORE** processing enable flag with its
superior window.  This is so that the user need not be aware of the distinction
between the typeout window and its superior, when he uses the Terminal M
command.  For example, typing Terminal M when an editor window is selected
complements **MORE** processing for typeout in that window, and the user need
not be aware that typeout actually happens in a different window called a
typeout window.

The implementor is not so lucky.  Many types of windows that are used for
display rather than for sequential output have been written to turn off **MORE**
processing by setting the init-option :MORE-P to nil.   This now has the effect
of turning off **MORE** processing in the typeout window as well.  Furthermore,
if the user turns that back on with Terminal M, he turns on **MORE** processing
in the main window as well, which may interfere with its display updating.

The correct solution is to eliminate **MORE** processing in the superior window
regardless of the state of that window's **MORE**-enable flag.  This can be done
in two ways:

This method causes **MORE**'s, when they happen in the main window, to do nothing.

(defmethod (my-display-window-with-typeout-window :more-exception) ()
  (setf (tv:sheet-more-flag) 0))

The other method is to mix the new mixin TV:INTRINSIC-NO-MORE-MIXIN into
your flavor of window.  This redefines the :MORE-P and :SET-MORE-P operations
to operate on a separate flag which exists only to remember Terminal M and
transmit it to inferior windows; at the same time, it initializes the "real"
**MORE**-enable flag to nil.

[15] WHEN and UNLESS.

WHEN and UNLESS are two simple new control structure
macros.  The first argument is a condition expression, and the
remainder is a body to be executed if the condition is true (for
WHEN) or if it is NIL (for UNLESS).

Using one of these macros is equivalent to writing an AND or an
OR with a PROGN as its second argument.

[16] Changes in SXHASH.

When SXHASH is given a named structure or a flavor instance, it
offers the object a chance to supply its own hash code by handling the
:SXHASH operation.  The value returned should be the hash code,
a nonnegative fixnum.

If SXHASH is given a non=NIL second argument, this says
that the address of an object may be used as its hash code if no other
means of computing a hash code is available.  The kinds of objects for
which this is done are incomprehensible to EQUAL, so it is still
true that the SXHASHes of two objects that are equal are the
same.  However, if you use this option, you must be prepared to deal
with hash codes changing due to garbage collection.

If the object is an array and the second argument is absent or
NIL, the length of the array is now used as its hash code.
It's better than always using zero.

[17] Transcendental functions of small flonums

The functions SQRT, SIN, SIND, COS, COSD, ATAN and ATAN2 will now
return small flonums when given small flonums as arguments.

[18] LET-GLOBALLY works on initially-unbound variables.

You can now change a variable temporarily with LET-GLOBALLY even if it does
not already have a value.  The variable becomes unbound again on exit from
the body of the LET-GLOBALLY.


Changes in utilities and operation:

   [@] Unlimited levels of Undo in the editor.
   [A] QC-FILE uses indentation to pinpoint parenthesis mismatches.
   [B] Undefined function references go in the compiler warnings data base.
   [C] Compiled functions record the macros expanded during compilation.
   [D] UNCOMPILE works reliably.
   [E] Terminal F no longer clears out the idle time.
   [F] The error handler: storage allocation, warnings, and background errors.
   [G] ZWEI now contains a "buffer editor", invoked with M-X Buffer Edit.
   [H] M-X Dissociated Press is now implemented.  Try it!  It's fun.
   [I] Finish Patch now allows multi-line descriptions of patches.
   [J] ZWEI variables *INDENT-WITH-TABS* and *ALPHABETIC-CASE-AFFECTS-SEARCH*.
   [K] New ZWEI commands Tabify and Untabify.
   [L] C-Shift-Y in minibuffers; echo area output/prompting in minibuffers.
   [M] ZWEI commands Create Directory, Remote Connect and Remote Access
   [N] Help L works in all kinds of editor windows.
   [O] DIRED now has an R command, for renaming a file.
   [P] The Lisp Edit window and the Ztop mode in ZMACS now work much better.
   [Q] The inspector displays arbitrary size arrays.  Control-V and Meta-V.
   [R] Peek now has a menu of modes.
   [S] You must now use Control-Abort to get out of HOSTAT.
   [T] A DEFSYSTEM can specify the filetype for binary files.
   [U] ZMAIL: Profile editor, argument prompting, and :GMSGS-HOST option.
   [V] How to use the garbage collector.
   [W] Spacewar.
   [X] Multi-font files in ZWEI.
   [Y] Reverse-video region marking.

[@] In the editor, you can now undo more than just the last change you have made.

Each time you do M-X Undo (or C-Shift-U), it undoes one change.
You can redo the changes undone with M-X Redo or C-Shift-R.

If you set the variable ZWEI:*UNDO-SAVE-SMALL-CHANGES* non-NIL, all changes
you make are recorded for undoing.  Each batch of consecutive changes is
recorded as one unit of undoing.  This may become the default in a little while,
after people have had a chance to exercise it.

The undo records are stored separately for each buffer, and are cleared out when
you read or write a file, or when you do M-X Discard Undo Information.  I do
not know yet whether the existence of a large amount of undo information can
possibly slow down editing operations enough to notice.

[A] QC-FILE now uses the indentation of the source file to detect
mismatched parentheses.  A mismatch in one function will now ruin
only the compilation of that one function, not the entire file.

The compiler assumes that you follow the usual indentation convention
that an open parenthesis in column zero indicates the start of a top
level list.  (This is the same convention that the editor assumes).
If the compiler finds an open parenthesis in column zero in the middle
of a list, it invents enough close parentheses to close off the list
that is in progress.  A compiler warning is produced instead of an
error.  After that list has been processed, the open parenthesis is read
again.  The compilation of list that was forcefully closed off is
probably useless, but the compilation of the rest of the file is
usually correct.  You can read the file into the editor and fix and
recompile just the function that was unbalanced.

A similar thing happens on end of file in the middle of a list, so that
you get to see any warnings for the function that was unbalanced.

Certain special forms including as EVAL-WHEN, PROGN, LOCAL-DECLARE,
DECLARE-FLAVOR-INSTANCE-VARIABLES, and COMMENT are customarily used
around lists that start in column zero.  These symbols have a non-nil
SI:MAY-SURROUND-DEFUN property that makes it ok for a list to start
in column zero inside them.  You can add such properties to other symbols
if you want.  You can also turn off the indentation checking feature
by setting COMPILER:QC-FILE-CHECK-INDENTATION to NIL.  However, please
report to me any case in which this feature causes problems.  I would
like to improve it to the point where nobody could ever mind it.

The compiler implements this feature by calling READ-CHECK-INDENTATION
instead of READ.  That function does all the work.  It signals the
:MISSING-CLOSEPAREN condition if it finds a problem, with an argument
that is T if the problem was end of file, or NIL if it was an open
paren in column zero.

[B] Meanwhile, references to undefined functions in functions being compiled
now produce ordinary compiler warnings which go in the data base of such.
Rebinding an instance variable also produces a warning, telling you
that the inner binding is just a local variable.

[C] In newly compiled files, the macros used in each function are
recorded in its debugging info.  So WHO-CALLS of a macro works.

[D] (UNCOMPILE function-spec) now reliably replaces a compiled function
definition with the equivalent interpreted definition, or tells you that
it cannot do so.  It can always do so if the function was compiled in
core.

[E] Commands using the Terminal key, such as Terminal 1 F, no longer
clear out the keyboard idle time that appears in the who line and in
FINGER.

[F] The error handler: storage allocation, warnings, and background errors.

The error handler now uses its own area for storage allocation, and
takes care to make sure that the area is kept supplied with free space.
As a result, you are much less likely to have any problem getting into
the error handler on an error due to the exhaustion of the address space
or some important area.

If the error handler is entered while the default cons area is a
temporary area, it will print a message to warn you to be careful.

If an error happens in a process which has no window or other suitable stream to
type out on, the window system tries to assign it a "background window" and
print a notification to tell you it is there.  If the window system is in a clean
state at the moment, this can be done, and you can then type Terminal 0 S to
select the background window.

However, if the window system cannot notify you, because windows are locked,
The window system can still inform you of the error.  The who-line displays a
string containing flashing asterisks that tells you there are errors in the
background.

At this time you can either try using Terminal Control-Clear-Input to unlock
the locks and allow the notification to be printed normally, or you can elect to
handle the error using the cold-load stream by typing Terminal Call.  This
command normally enters a break-loop that uses the cold-load stream, but if
there are any background errors, it asks you about handling one of them instead.

[G] ZWEI now contains a "buffer editor", invoked with M-X Buffer Edit
or M-X Edit Buffers.  This is analogous to DIRED, but for buffers
instead of files.  It displays a list of all ZMACS buffers, which you
move through using ordinary editing commands.  You can specify to
save, kill, write, revert, unmodify and select buffers by typing
single character commands that refer to the buffer you are pointing at.
Type Help while in this mode to get the details.

[H] M-X Dissociated Press is now implemented.  Try it!  It's fun.

[I] Finish Patch now allows you to specify multiple lines of description
of what the patch is for.  You end the description with End now, rather
than Return.

[J] ZWEI has new variables:
 *INDENT-WITH-TABS*, T by default, says that indentation commands should
 insert tabs.  NIL says they should use only spaces.

 *ALPHABETIC-CASE-AFFECTS-SEARCH*, NIL by default, says if T that searches
 should only find text that matches the case of the search string.
 This affects Query Replace as well.

[K] New ZWEI commands:
Untabify replaces all tabs after point (or in the region) with spaces.
Tabify   replaces spaces (in runs of three or more) with tabs as much
	    as possible.
List Flavor Components
	  lists the names of all components of a specified flavor.
	  You can edit them with C-Shift-P or C-., or click on one
	  with the mouse.
List Flavor Dependents
	  lists the names of all flavors that incorporate a specified flavor.
	  You can edit them with C-Shift-P or C-., or click on one
	  with the mouse.
List Flavor Methods
	  lists all the methods of the specified flavor.
	  You can edit them with C-Shift-P or C-., or click on one
	  with the mouse.  The list does not include inherited methods.
Edit Flavor Components, Edit Flavor Dependents, Edit Flavor Methods
	  These are similar, but immediately visit the first one's definition
	  without bothering to a display a list of all the names.
Edit System Warnings
	  Edit Warnings for all source files in a specified System.

[L] Minibuffer improvements:

In most minibuffers, the command C-Shift-Y will yank either the default
value or the old value of some parameter you are modifying.

For example, in the second argument to Query Replace, it yanks the
string being replaced.  In Set Fonts, it yanks the old list of fonts.
In Set Variable, it yanks the old value of the variable.

When reading buffer names, filenames or function names, C-Shift-Y yanks
the same value that would be used if you just type Return.

Many of these default strings used to be made available by temporarily
pushing them on the kill ring, so you could yank them with C-Y.
However, this interfered with using the kill ring to move text in and
out of minibuffers as one would naively expect to be able to do.  Now
minibuffers do nothing strange to the kill ring and it works as one
would expect.

One additional feature: echo area output while you are in the minibuffer
now stays on the screen long enough to be read.  After a pause, it
disappears and the minibuffer reappears.

[M] The ZWEI commands M-X Create Directory, M-X Remote Connect and
M-X Remote Access provide convenient interfaces to the new functions
FS:CREATE-DIRECTORY and FS:REMOTE-CONNECT.  The first creates a
directory on a file server.  The other two commands perform the
equivalent of the Twenex CONNECT and ACCESS commands, in the remote file
server, but affect access control only.  They do not affect filename
defaulting.  To get the same effect as the Twenex CONNECT command for
filename defaulting, use the "working directory" feature documented in
item [a], below.

[N] All windows now record type-in, and support the :PLAYBACK operation
which returns an array containing the last 60 characters of input.
Help L, which uses this operation, now works in all kinds of editor windows,
including ZMAIL, Converse and DIRED.

[O] DIRED now has an R command, to rename the file on the current line.
You type the new filenames using the mini buffer.
The filename in the line in the dired buffer is changed to reflect what
you have done.  If you rename the file to a different directory,
you are offered the choice of deleting the line from the dired buffer.

[P] The Lisp Edit window and the Ztop mode in ZMACS now work much better.
Their former gross problems have been fixed.

[Q] The inspector can display the contents of all arrays regardless of size
or number of dimensions.  The commands Control-V and Meta-V scroll the
bottom inspect pane.

[R] Peek now has a menu of modes.  Click on a mode in the menu to select
that mode.  The current mode is highlighted.  The keyboard commands still work.

[S] You must now use Control-Abort to get out of HOSTAT.

[T] When you define a system with DEFSYSTEM, you can now specify the filetype
to use for compiled files in that system.  The default is still "QFASL".

To specify some other string, such as "MYFASL", include
a (:DEFAULT-BINARY-FILE-TYPE "MYFASL") in the DEFSYSTEM.
Then MAKE-SYSTEM, LOAD and QC-FILE all know to use MYFASL by default for all
the files in your system.

[U] ZMAIL improvements:

If you go into ZMAIL's profile editor and actually edit the text of your
ZMAIL init file, when you type End to exit, the ZMAIL options are all
set based on the editing you did.

ZMAIL now allows a BABYL file to have a :GMSGS-HOST option which specifies
which host to do GMSGS on, for that BABYL file.  Thus, if you keep your
BABYL file on OZ, which has no GMSGS server, you can have GMSGS done on AI.

ZMAIL's command loop now prompts like ZWEI and EMACS for multi-line commands.

There is now an O command which moves the current message to a file
whose name is read using the mini buffer.

Errors in background saves no longer permanently hang the background process.

[V] How to use the garbage collector:

You can turn on automatic use of the garbage collector by doing
(SI:GC-ON).  (SI:GC-OFF) turns it off.

Normally, automatic garbage collection happens in incremental mode; that
is, scavenging happens in parallel with computation.  Each consing
operation scavenges or copies four words per word consed.  In addition,
scavenging goes on whenever the machine appears idle.

If you are running a noninteractive crunching program, the incremental
nature of garbage collection may be of no value.  Then you can make
garbage collection more efficient by making it a batch process.  To do
this, set SI:GC-RECLAIM-IMMEDIATELY to non-nil.  This flag causes
automatic garbage collections to be done as batch operations: the
garbage collection process scavenges and reclaims oldspace immediately
right after a flip happens, and uses all of the machine's
physical memory.  (Incremental scavenging is restricted to a fixed
amount of physical memory to reduce its interference with your other
activities).  This variable is only relevant if you have turned on
automatic garbage collection with (SI:GC-ON).

In addition to turning on automatic garbage collection, you can also
manually request one complete collection with the function SI:FULL-GC.
The usual reason for doing this is to make a band smaller before saving
it.  SI:FULL-GC also resets all temporary areas.

You can cause all the normally static (not garbage collected) areas to
be garbage collected, just this once, by passing a non-nil argument to
SI:FULL-GC.  This can further reduce the size of a band, but is usually
not needed except right after a new system band has been built.  After
these areas have been cleaned up once, they usually don't accumulate
much additional garbage.

A more selective way of causing static areas to be garbage collected
once is to call SI:CLEAN-UP-STATIC-AREA.  The argument is the area
number of a static area; that particular area will be garbage collected
the next time SI:FULL-GC is called.  This way you can control which
areas to add to the garbage collection.

In system 87, any request to perform garbage collection will warn and
query you if there is not enough free space to be sure of success.  The
criteria for success have been newly adjusted and made to depend properly
on whether you are doing incremental gc or batch.

The function SI:GC-STATUS prints information related to garbage collection.
When scavenging is in progress, it tells you how the task is progressing.
It prints both a maximum and a minimum, since there is no way of predicting
how much oldspace data will have to be copied and scavenged.
While scavenging is not in progress and oldspace does not exist,
it prints information about how soon a new flip will be required.

When you garbage collect to reduce the size of a band, it is best to do
two garbage collections.  If you process any static areas, you should
process the same ones both times.  This is to keep the data compacted
toward the bottom of the virtual address space, which makes it possible
to run the saved band in small PAGE partitions.  Here is why it works:

The saved system band occupies a nearly contiguous range of virtual
memory, at the bottom of the address space.  Doing one garbage
collection copies all the useful data.  Since the lowest addresses were
already in use before, the copy has to occupy higher addresses.  The low
addresses become a hole.  The highest used address is now much higher
than before.

The second garbage collection copies everything again.  Assuming that
the first garbage collection actually freed some data, the copy will fit
into the hole left by the first garbage collection.  The high addresses
used after the first collection are now free, and the highest used
address is back down to its original value.

If you do only one garbage collection and then load in more data,
another garbage collection later will not have a neat hole to copy
into.  Fragmentation may develop.  As long as two garbage collections
are done in a row, there should be no problem.  In any case, problems
will only occur with PAGE partitions smaller than 36000 blocks.

[W] Spacewar.

Spacewar, the original video game, is now available.
To run it, load SYS:IO1;SWAR and call SPACEWAR:SPACEWAR.

[X] Multi-font files in ZWEI:
You can now specify the interline spacing with the attribute VSP: number;
in the file's attribute list.  The variable *VSP* (initially 2) is used for files that
do not specify a vsp.

The command M-X Set Vsp, which now uses a numeric argument to determine
the new vsp, sets the current file's vsp, temporarily overriding the attribute list.
If you then do M-X Update Attributes List, the attribute list will be updated to
contain what you specified by hand.

Writing multi-font files is much faster now.
(Reading them was sped up in system 86.)

[Y] Reverse-video region display

Reverse-video region display, which you get by setting
ZWEI:*REGION-MARKING-MODE* to :REVERSE-VIDEO, is now improved.
There is no longer a band of white between the lines of the region.

The new variable ZWEI:*REGION-RIGHT-MARGIN-MODE*, if set to T, causes the
reverse video area (or underlining, if you are using that) on a line to extend all
the way to the right margin if the region does not end on that line.

Pathname improvements:

   [a] Improvements to defaulting.  Working directories.
   [b] Working Directories.
   [c] Improvements for Unix pathnames.
   [d] Logical pathnames: case conversion, and  for :UNSPECIFIC.
   [e] Quoting in Twenex pathnames.

[a] Improvements to defaulting.

The default type if you specify a name only and no type is now "LISP".
It used to be :UNSPECIFIC.  I think this will be more useful.
(Actually, the value of the variable FS:*NAME-SPECIFIED-DEFAULT-TYPE*
is what is used.)

As before, setting FS:*ALWAYS-MERGE-TYPE-AND-VERSION* to T causes the
type of the default pathname to be used instead of a uniform default.
In this case, the value of the new variable is irrelevant.

[b] Working Directories.

The Lisp machine now remembers a "working directory" for each host.
It is actually a device name and optionally a directory name.  Whenever
you specify device DSK in a pathname, MERGE-PATHNAME-DEFAULTS replaces
it with the working device for that host; in addition, if the pathname
has NIL for a directory, the working directory will be used rather
than the current default.

For example, if the working directory for host OZ is PS:<RMS>, then
specifying "OZ:DSK:FOO" is equivalent to specifying "OZ:PS:<RMS>FOO",
and specifying "OZ:DSK:<BAR>FOO" is equivalent to specifying
"OZ:PS:<BAR>FOO".

The function (FS:SET-HOST-WORKING-DIRECTORY host pathname)
sets the working directory for host to that specified in pathname.

The working directory is a local, inside-the-lisp-machine equivalent of
the effect of the Twenex CONNECT operation on pathname defaulting; but
it works on all kinds of file systems for which you can specify a device
name -- all but Unix and Multics.  Something can be done for them too,
if people like this feature.

The ZWEI command M-X Set Working Directory provides a convenient
interface to this command.

[c] Improvements for Unix pathnames.

Case is now preserved in Unix pathnames!  It used to be that you could
not input a Unix pathname differing only in case from a previously
entered Unix pathname, because the system would canonicalize it into the
previous one.  This problem is no longer with us.

[d] The translations of a logical host can now specify a physical device as
well as a physical directory for each logical directory.  Simply include
a device name in the pathname string that specifies what to translate to.
In addition, they can specify a default physical device for use with
directory names not mentioned specifically in translations.  This is
specified by providing a translation for logical directory name NIL.

Logical pathnames are now converted to upper case, except for characters
quoted with .  This seems to be the best thing to do, even though some
file servers consider case significant, because the purpose of logical
pathnames is transportability between file servers, and to try to make
any use of case distinctions in pathnames would defeat that purpose.
If anyone is using logical pathnames with a Unix system and dislikes
having his pathnames in upper case there, he should tell me; I have an
idea for how to do this in a clean fashion, but I don't want to
implement it unless there is actual need.

The character  (up-horseshoe) can now be used in logical pathnames to
signify a name, type or version of :UNSPECIFIC.  This is differerent
from the character , which signifies a name, type or version of NIL
(that is, to be replaced by the default).  Using  for the type and
version, you can now type in the typical generic pathname.  To include a
 character in a name, quote it with .

[e] Quoting wildcards in Twenex and Tenex pathnames are now

* and % when not quoted are wildcard characters that match any string or any
single character, respectively.  This is not new.

What is new is that quoting * and % works and allows you to refer to a file
whose name contains those characters.

Quoting is, as before, done with the character  (ASCII ^V), which must itself be
quoted with a slash when included in a string.
    

Last modified: 2025/06/05 08:57:08 (UTC) by ams