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