Date: 16 June 1982 07:01-EDT From: Richard M. Stallman <RMS at MIT-AI> Subject: System 86 announcement To: INFO-LISPM at MIT-AI The announcement for system 86 is finished. System 86 has no known new bugs now, and several interesting new features, including tail recursion as a run-time option. See LMDOC;SYS86 MSG. System 86 comes with microcode 136. Microcode 136 will work with system 85. Microcodes 117, 123 and 124 will work with system 86, modulo minor bugs that existed for months or years, if you do not use tail recursion. There are no major incompatibilities in source code between system 85 and system 86. System 85 compiled code will also all run in system 86. 86 is very well debugged, and there is little reason for anyone not to move from 85 to 86 right away. Major Changes:: [1] DEFSUBST functions now run compiled. [2] :SELF-FLAVOR declarations. [3] The Mode Line functions and editor commands have been renamed. [4] You can now make flavor instances print out so they can read back. [5] Tail Recursion! New Functions: [6] MAKE-ARRAY accepts a new argument keyword :INITIAL-VALUE. [7] The function (STORE-CONDITIONAL location oldvalue newvalue) now exists. [10] VIEWF, UNDELETEF, FUNDEFINE and PRINT-HERALD are now in GLOBAL. [11] The function UNDEFUN is improved. [12] New functions LOCATION-BOUNDP and LOCATION-MAKUNBOUND. [13] The functions SEND and LEXPR-SEND are now defined. [14] The special form WITH-HELP-STREAM creates a stream for a help message. [15] FS:DIRECTORY-LIST and FS:DIRECTORY-LIST-STREAM are improved. [16] Window input operations: :ANY-TYI and :WAIT-FOR-INPUT-WITH-TIMEOUT. [17] ZWEI:INTERVAL-WITH-FONTS-IO now supports :SET-POINTER (to 0 only), [20] New functions for closures. [21] New special forms: VARIABLE-BOUNDP, VARIABLE-MAKUNBOUND, VARIABLE-LOCATION. [22] The new function TIME-INCREMENT adds a number to a time (such as (TIME) [23] The new function FUNCTION-NAME, returns the name of any sort of function object. [24] The new function FS:FLAVOR-ALLOWED-INIT-KEYWORDS. [25] New functions to read and print intervals of time. [26] SI:NULL-STREAM. [27] How to add new keywords for ADD-INITIALIZATION. [28] New macro WITH-OPEN-STRING. [29] WITH-INPUT-FROM-STRING and WITH-OUTPUT-TO-STRING can now be nested. Utilities and Operation: [@] Compiler warnings are now recorded in a data base of list structure. [A] New font handling features in PRESS:PRINT-FROM-STREAM. [B] You can specify a filename instead of a buffer name in ZWEI. [C] You can easily insert defaults while typing a filename in ZWEI. [D] M-X Save All Files now asks all its questions immediately. [E] C-M-L now operates on all the buffers that you see in a List Buffers. [F] ZWEI can display a file while still reading it. [G] New ZWEI commands for producing hardcopy: [H] Inspector improvements. [I] Passwords for file jobs are remembered for you. [J] Better DWIM in BREAKON, TRACE and ADVISE. [K] Reloading files from which some methods have been deleted. [L] Changes in Terminal key commands. [M] Reading multi-font files into ZWEI should be much faster. [N] New ZWEI feature for visiting lists of things (callers, etc.) [O] There are three new commands for manipulating patches: [P] DRIBBLE-ALL is a new alternate way of saving your terminal i/o. [Q] Conversation-motion commands in CONVERSE. [R] CHAOS:NOTIFY and CHAOS:NOTIFY-ALL-LMS [S] DIRED features. [T] It is no longer necessary to do TV:SET-TV-SPEED. [U] Each lisp listener window now has its own binding of PACKAGE. [V] TV:SET-DEFAULT-FONT now works "right". [W] New feature to allow shift keys to replace double-clicking. [X] New feature in Choose-Variable-Values. [Y] Hosts not in the host table can be named, as CHAOS|nnnn. [Z] Control-Shift-letter and Meta-Shift-letter in ZWEI: [AA] Help Apropos in ZWEI is now much faster. The worst incompatibility comes from this feature: [1] DEFSUBST functions now run compiled. You can now compile a DEFSUBST just like any other function. The resulting compiled subst executes with the speed of compiled code when applied, but the expr definition is still present as well to enable the compiler to open code explicit calls to the DEFSUBST. These compiled DEFSUBSTs run properly in old systems, but only system 86 knows how to expand them when you compile calls to them. If you do your compilation in 86, the resulting binary files should work in earlier systems, but if you compile a file of definitions in 86, load the result into 85, and compile other files there which use the definitions, they will fail to be open-coded. This can be patched in 85 if people need it. But it may be easier for you to simply stop using 85. Undeclared free variables in DEFSUBSTs do not get warnings, because they occur frequently (default pointers in DEFSTRUCTs, etc.). Such a DEFSUBST is reasonable as long as you intend it only to be expanded; if you call it at run time, an error will occur then since the variable will be unbound. Changes in programming: [2] :SELF-FLAVOR declarations. In place of DECLARE-FLAVOR-INSTANCE-VARIABLES around a function, you can now use (DECLARE (:SELF-FLAVOR flavorname)) as the first thing in the body of the function. This is cleaner because it allows the DEFUN itself to be the top-level list in your file. While this form of code can only be compiled in system 86, the compiled code is identical to that produced for DECLARE-FLAVOR-INSTANCE-VARIABLES, and runs at full speed in system 85, and at lower speed in system 79. The purpose of this change is to reduce the need to put anything "around" the DEFUNs in source files. [3] The Mode Line functions and editor commands have been renamed (to Attribute List). The list of properties obtained from the "-*-" line at the front of a text file is now called the file's attribute list rather than its property list. The functions for accessing this are now FS:FILE-EXTRACT-ATTRIBUTE-LIST (stream) return the attribute list read from that stream, which should initially be at beginning of file. The stream will have its pointer returned to the beginning after the operation. The list is returned as an alternating list of properties (interned in USER) and values. :MODE, :PACKAGE, :BASE are typical. FS:FILE-READ-ATTRIBUTE-LIST (generic-pathname stream) read the attribute list from the stream, and put each attribute as a property on the generic pathname. FS:FILE-ATTRIBUTE-LIST (pathname) return the attribute list of the specified file (text or qfasl). FS:FILE-ATTRIBUTE-BINDINGS (generic-pathname) returns two values describing the bindings to be made before reading things from that file. The two values are a list of variables and a list of values. They can be passed to PROGV to do the binding. Variables bound will typically include PACKAGE, BASE and IBASE. The ZWEI commands Update Mode Line and Reparse Mode Line now have new names Update Attributes List and Reparse Attributes List. The former changes the file's -*- line to contain the current mode, package, fonts, and base. The latter examines the attribute line and sets the current mode, package, fonts, and base. A related new ZWEI command is Dired Print File Attributes (invoked by , in DIRED) which prints out the attribute list of the file indicated by the cursor. [4] You can now make flavor instances print out so they can read back. Pathnames use this mechanism; you will see that they print out a little differently. You can make use of this feature for any other sort of abstract object (flavor or class instance, or named structure). Your object must print itself out as #typename additional-data. (For those not reading this on a Lisp machine, and are horseshoes). You can bring this about by defining the object's :PRINT-SELF operation to print that way, using whatever additional-data you need. typename is a keyword that READ uses to figure out how to read in the rest of the printed representation and construct the object. It is read in in package USER (but it can contain a package prefix). The resulting symbol should either have a SI:READ-INSTANCE property or be the name of a flavor which handles the :READ-INSTANCE operation. In the first case, the property is applied as a function to the typename symbol itself and the input stream. In the second, the handler for that operation is applied to the operation name (as always), the typename symbol, and the input stream (three arguments, but the first is implicit and not mentioned in the DEFMETHOD). SELF will be NIL and instance variables should not be used. In either case, the handler function should read the remaining data from the stream, and construct and return the datum it describes. It should return with the "" character waiting to be read from the input stream (:UNTYI it if necessary). READ will get an error after it is returned to if a "" character doesn't follow. The typename can be any symbol with an appropriate property or flavor, not necessarily related to the type of object that is created; but for clarity, it is good if it is the same as the TYPEP of the object printed. Since the type symbol is passed to the handler, one flavor's handler can be inherited by many other flavors and can examine the type symbol read in to decide what flavor to construct. [5] Tail Recursion! The Lisp machine is now tail-recursive if the variable TAIL-RECURSION-FLAG is not NIL. Specifically, any time one function finishes by calling another function, if no special variables or catches are present in the calling function, the caller's stack frame will be thrown away. This means that certain programs will now execute in bounded stack space which used to require unbounded stack space. It has an intrinsic drawback: less information is left on the stack to be examined in the error handler. It is for this reason that the new mode is optional. Tail recursion does not take place when -- the calling function has bound special variables -- the call is within a *CATCH in the calling function. -- the calling function has a &REST argument which lives on the stack. -- the calling function has asked for the location of any argument or local variable. New Functions: [6] MAKE-ARRAY accepts a new argument keyword :INITIAL-VALUE. The value supplied with the :INITIAL-VALUE keyword is stored in every element of the array. This uses the new function (ARRAY-INITIALIZE array value start end) which is by far the fastest way to propagate one value through an array. Another new function is ARRAY-RANK, which is a new name for ARRAY-/#-DIMS. [7] The function (STORE-CONDITIONAL location oldvalue newvalue) now exists. It stores the new value only if the contents match the old value. This is a basic building block for atomic testing-and-modifying operations for interlocking. **NOTE** if given a list as first argument, it tests and stores into the CDR of the list, not its CAR. This is in accord with the general principle that you should reference locatives with CDR rather than CAR: then CDR of the list pointer gets you the cdr of the cons cell, and CDR of the locative pointer gets you the car of the cons. Thus, by passing a function either the list pointer or the locative, you can cause the function, which uses CDR, to refer to either the car or the cdr of the cell you have in hand. (LOCF (CAR ...)) and (LOCF (CDR ...)) are defined so as to work with this convention. [10] VIEWF, UNDELETEF, FUNDEFINE and PRINT-HERALD are now in GLOBAL. VIEWF prints the contents of a file. UNDELETEF undeletes a file. FUNDEFINE undefines any function spec. PRINT-HERALD prints the things that are printed at the top of the screen when you boot (system version numbers, machine host name, etc). [11] The function UNDEFUN, which reverts a function spec to its previous definition, now offers to FUNDEFINE the function spec if it has no previous definition. [12] New functions LOCATION-BOUNDP and LOCATION-MAKUNBOUND. The function LOCATION-BOUNDP, given a locative, tells you whether the loction is bound, as opposed to "unbound" (contains DTP-NULL). (LOCATION-BOUNDP (VALUE-CELL-LOCATION exp)) is equivalent to (BOUNDP exp). Similarly, there is LOCATION-MAKUNBOUND, which makes the location be "unbound". [13] The functions SEND and LEXPR-SEND are now defined. These are now the preferred names for message-passing to objects. At present, they are simply macros which expand into FUNCALL and LEXPR-FUNCALL respectively. It is possible that at some future time additional functionality might be added to message passing which will require the use of the new functions. [14] The special form WITH-HELP-STREAM creates a stream for use in printing a long help message. It takes the form (WITH-HELP-STREAM (stream . options) &BODY body) Options are :LABEL label, :WIDTH width-var, :HEIGHT height-var, and :SUPERIOR superior-window. The label should be something appropriate for the message. The WIDTH and HEIGHT options are useful if the program wants to format the help message based on the size of the window. The body gets turned into a LAMBDA-expression with the stream and the width and height variables bound appropriately; note that this means that variables from the surrounding program that are to be accessed by the body must be special. [15] FS:DIRECTORY-LIST and FS:DIRECTORY-LIST-STREAM are improved. The directory list element for pathname NIL, which describes the directory as a whole, now contains a property named :PATHNAME whose value is the pathname which the directory list was made from. If you specify a directory that does not exist, and type a name to use instead from the terminal, this will be the name that was actually used. ZWEI uses this, so that it correctly understands what directory was ultimately specified in DIRED, etc. Note how this has no connection with any "new error system". Having hacked the error handler recently, I can appreciate some of the benefits to be had from a new error system, and I plan to implement one as soon as Symbolics has finished (so it can be compatible in use). But I also believe it has been used as an excuse in many contexts where it is not really relevant. [16] Window input operations: :ANY-TYI and :WAIT-FOR-INPUT-WITH-TIMEOUT. The operation :ANY-TYI is now defined on all windows (all which have :TYI, that is -- it is in TV:STREAM-MIXIN). The only thing that TV:ANY-TYI-MIXIN does now is cause :TYI to discard everything but fixnums. This will eventually become the default behavior and TV:ANY-TYI-MIXIN will become a no-op. The operation :WAIT-FOR-INPUT-WITH-TIMEOUT is also now defined in TV:STREAM-MIXIN. This operation takes an argument, an amount of time in 60'ths of a second, and returns in that amount of time or when input is available, whichever comes first. [17] ZWEI:INTERVAL-WITH-FONTS-IO now supports :SET-POINTER (to 0 only), :PATHNAME, and :FRESH-LINE messages. This means these fake files act more like real ones than before; this might be useful to someone. (ZWEI:INTERVAL-IO streams have supported these for some time; however, a related bug has been fixed.) [20] New functions for closures. CLOSURE-VARIABLES returns a list of the variables bound in a closure; EQUAL to the first argument used when the closure was made. COPY-CLOSURE returns a new closure with the same function, variables andvalues as the one you provide. The new closure and the old one do not share bindings. (BOUNDP-IN-CLOSURE closure symbol-or-locative) returns T if that symbol or locative would be BOUNDP (or LOCATIVE-BOUNDP) if you were inside the closure. MAKUNBOUND-IN-CLOSURE, with the same arguments, makes it be not bound. These join the existing functions SYMEVAL-IN-CLOSURE and SET-IN-CLOSURE. All four can read or write the current binding of the variable if the closure does not bind it. [21] New special forms: VARIABLE-BOUNDP, VARIABLE-MAKUNBOUND, VARIABLE-LOCATION. (VARIABLE-LOCATION "E variable-name) returns a locative pointing to where the value of the variable is stored. This used to be written as (VALUE-CELL-LOCATION 'variable-name), but it is really incorrect for VALUE-CELL-LOCATION to know about local variables. It should always refer to the symbol's value cell, like SYMEVAL and SET. For now, it still does know about local variables, but the compiler warns you if you use it that way. Similarly, use (VARIABLE-BOUNDP variable-name) to test whether a variable is bound. For ordinary local variables, this is not useful, since the answer is always T; but for flavor instance variables it is useful. (BOUNDP 'variable-name) continues to work, but elicits a warning from the compiler. VARIABLE-MAKUNBOUND also exists. Compiled code using these new special forms will run properly in earlier systems even though the special forms do not exist in those systems. [22] The new function TIME-INCREMENT adds a number to a time (such as (TIME) returns) to get a new time. The number is in units of 1/60 second. This function joins TIME-DIFFERENCE and TIME-LESSP. [23] The new function FUNCTION-NAME returns the name of any sort of function. If the argument is a function object for which a name can be determined, FUNCTION-NAME returns that name; otherwise, it returns the original object. This is useful for printing messages about a function. The second value returned is T if a name was actually found. A second optional argument, if non-nil, says that if the first argument is an instance of a flavor, the flavor name should be returned as the function name. This is not always desirable, because the flavor name doesn't identify the particular instance. [24] FS:FLAVOR-ALLOWED-INIT-KEYWORDS. The new function FS:FLAVOR-ALLOWED-INIT-KEYWORDS returns a list of all the init keywords which a specified flavor understands. The argument is a flavor name (a symbol). [25] New functions to read and print intervals of time. There are new functions for reading and printing time intervals. They convert between strings of the form "3 minutes 23 seconds" and fixnums representing numbers of seconds. Here are the details: TIME:PRINT-INTERVAL-OR-NEVER interval &OPTIONAL (stream standard-output) interval should be a non-negative fixnum, or NIL. This function prints interval's representation as a time interval onto stream. If interval is NIL, it prints "Never". TIME:PARSE-INTERVAL-OR-NEVER string &OPTIONAL start end string is the character string representation of an interval of time. start and end specify a substring of string to be parsed; they default to the beginning and end of string, respectively. The function returns a fixnum if string represented an interval, or NIL if string represented "never". If string is anything else, an error is signalled. Here are some examples of acceptable strings: "4 seconds" "4 secs" "4 s" "5 mins 23 secs" "5 m 23 s" "23 SECONDS 5 M" "3 yrs 1 week 1 hr 2 mins 1 sec" "never" "not ever" "no" "" Note that several abbreviations are understood, the components may be in any order, and case (upper versus lower) is ignored. Also, "months" are not recognized, since various months have different lengths and there is no way to know which month is being spoken of. This function will always accept anything that was produced by TIME:PRINT-INTERVAL-OR-NEVER; furthermore, it will return exactly the same fixnum (or NIL) that was printed. TIME:READ-INTERVAL-OR-NEVER &OPTIONAL (stream standard-input) This function reads a line of input from stream (using READLINE) and then calls TIME:PARSE-INTERVAL-OR-NEVER on the resulting string. [26] SI:NULL-STREAM. SI:NULL-STREAM (the symbol itself, not its value) can be used as an I/O stream which discards all output and returns immediate EOF on input. [27] How to add new keywords for ADD-INITIALIZATION. If you want to add new keywords that can be understood by ADD-INITIALIZATION and the other initialization functions, you can do so by pushing a new element onto the following variable: SI:INITIALIZATION-KEYWORDS [Variable] Each element on this list defines the name of one initialization list. Each element is a list of two or three elements. The first is the keyword symbol that names the initialization list. The second is a special variable, whose value is the initialization list itself. The third, if present, is a symbol defining the default "time" at which initializations added to this list should be evaluated; it should be SI:NORMAL, SI:NOW, SI:FIRST, or SI:REDO. This third element just acts as a default; if the list of keywords passed to ADD-INITIALIZATION contains one of the keywords NORMAL, NOW, FIRST, or REDO, it will override this default. If the third element is not present, it is as if the third element were SI:NORMAL. Note that the "keywords" used in ADD-INITIALIZATION need not be keyword-package symbols (you are allowed to use FIRST as well as :FIRST), because STRING-EQUAL is used to recognize the symbols. In addition to the system initialization lists mentioned in Revision 4 of the Lisp Machine Manual (on p. 490), there is a new initialization lists called SITE. This list is executed by the function SI:UPDATE-SITE-CONFIGURATION-INFO just after it loads the site table. Of the pre-defined system initialization lists, the default "time" for almost all of them is NORMAL, with the following exceptions: the SYSTEM and ONCE initialization lists default to FIRST, and the SITE initialization list defaults to NOW. [28] New macro WITH-OPEN-STRING. (WITH-OPEN-STRING (stream string . options) &BODY body) creates a stream associated with the specified string. This takes a keyword argument list instead of the positional arguments of WITH-INPUT-FROM-STRING and WITH-OUTPUT-TO-STRING, and permits the creation of bidirectional string streams. (The other macros expand into this now.) [29] WITH-INPUT-FROM-STRING and WITH-OUTPUT-TO-STRING can be nested. String input and output has been reimplemented based on select-methods and closures. (The stream given to the user is now a closure.) This means that these forms can be nested as desired, and the streams can be passed downward (the closures are not killed in any way by unwind-protects). The new implementation also supports :READ-POINTER and :SET-POINTER operations. (Read the comments in AI: LISPM2; STRING > for more information.) Changes in utilities and operating the machine: [@] Compiler warnings are now recorded in a data base of list structure. Each time a function is compiled, an entry for that function is made in the compiler warnings data base or updated. Warnings from the latest compilation go in the data base and warnings from previous compilations that did not happen this time are thrown away. The command Edit Warnings asks you, for each file that has warnings, whether you want to edit that file's warnings. Then, it fills the buffer *Warnings* with an up-to-date list of warnings for those files and starts you stepping through them. You use the two commands C-Shift-W and M-Shift-W to go to the next or previous warning. The command Edit File Warnings edits the warnings for one file only; you specify the file. Edit System Warnings edits the warnings for all the source files of a system; you specify the system. If you visit the buffer *Warnings*, you can go to any warning and type C-/ to visit the code for that warning. You can also do Insert Warnings to insert a complete current list of warnings in the buffer at point. The mark is placed after the end, though the region is not turned on. Insert File Warnings inserts the warnings for one file only. Meanwhile, errors in reading or macro expansion during compilation now produce warnings. They do not go to the error handler. This is so your compilation will finish and give you the rest of the errors in the file. If you need to go to the error handler, as before, set the variable COMPILER:WARN-ON-ERRORS to NIL and recompile. You can write part of the compiler warnings data base to a file for later reloading. Use SI:PRINT-WARNINGS (list-of-files stream). The :BATCH option of MAKE-SYSTEM now writes the data base in this fashion to a file whose name you are asked for. Reload the warnings written in the file, if necessary, with READFILE or M-X Load File. The warnings data base is not only for compilation. To learn how to interface to it, see the file LISPM;QNEW. [A] New font handling features in PRESS:PRINT-FROM-STREAM (and therefore PRESS:PRINT-FILE, PRESS:SPOOL-FILE, M-X Print File, M-X Print Buffer, M-X Print All Buffers, Hyper-Meta-P, the P command in DIRED, etc.): If the file being printed has a FONTS attribute, and you have not specified a FONT or FONT-LIST explicitly, PRINT-FROM-STREAM will attempt to do the right thing by reading your FONTS list. What it does is: 1. If your file only specifies one font, it is treated as (:FONT font). This causes the whole file to be printed in an appropriate font. 2. If your file specifies more than one font, is is treated as (:FONT-LIST (list-of-fonts)). This causes epsilon (code 006) characters in the file (such as ZWEI outputs for a fontified file) to be treated specially, so everything is printed in the correct font. The system associates Lisp Machine fonts with Dover fonts by looking them up in the A-list PRESS:DOVER-FONT-EQUIVALENCES. It currently knows about most of the popular Lisp Machine text fonts. Feel free to extend it to cover additional fonts. [B] You can specify a filename instead of a buffer name in ZWEI. When ZWEI asks you for a buffer name, you can now type C-Shift-F and then a filename (with defaulting and completion available as usual). The buffer containing that file is used. The file is read in if necessary. [C] You can easily insert defaults while typing a filename in ZWEI. Whenever ZWEI asks you for a file name, you can now type C-Shift-Y to yank the default value (as mentioned in the prompt) into the minibuffer, or M-Shift-Y to yank the last filename you typed previously (as you had typed it). Previously, ZWEI used to push these onto the kill ring temporarily. This interfered with moving text between the mini buffer and top level on the kill ring. [D] M-X Save All Files now asks all its questions immediately, and then does whatever saving you requested. [E] C-M-L now operates on all the buffers that you see in a List Buffers, with the exception of DIREDs and MAILs that you have exited normally (Q in DIRED, End in MAIL). And List Buffers (C-X C-B) shows you the same order of buffers that C-M-L rotates. [F] ZWEI can display a file while still reading it. If you set the variable ZWEI:*FIND-FILE-EARLY-SELECT* to non-NIL, then when you visit a new file in ZWEI, the beginning of the file will be displayed as soon as enough of the file is read in. Editing commands will not be executed, though, until the file is all in. Also, if the file is being read in as part of some more complicated command (such as Meta-.) then this display will not take place, since the beginning of the file may be the wrong part to display. [G] New ZWEI commands for producing hardcopy: M-X Print Buffer Sends a buffer to the Dover. Prompts in minibuffer. M-X Print All Buffers Asks if you want each of your buffers printed, then prints the ones you asked for. Hyper-Meta-P (Quick Print Buffer) Prints the current buffer. The file LMLIB;DOVERB is now obsolete. [H] Inspector improvements. The inspector now has keyboard commands to do the things that the menu does. In particular, you can modify a field by selecting it with the mouse while holding down the Hyper key. You can return by typing End; the value of * is returned from the function INSPECT if you had reached the inspector that way. Type Help to find out more about keyboard commands. While in the inspector, the variables *, ** and *** have as their values the three objects being displayed in the inspection panes. * is the bottom one and *** is the top one. Lists are now displayed in a more appropriate format, and very large or deep lists are truncated. The ellipses "..." and "**" replace what is not displayed. Click on them to see what they abbreviate. [I] Passwords for file jobs are remembered for you. The passwords you specify when you connect to file servers are now remembered on FS:USER-HOST-PASSWORD-ALIST for the duration of your session unless you set FS:RECORD-PASSWORDS-FLAG to NIL. In any case, any passwords which are on the alist (perhaps from your init file) will be used rather than asking you for one. If you are super paranoid, you can set the alist to NIL in your init file as well as setting the flag to NIL. [J] Better DWIM for functions in the wrong package in BREAKON, TRACE and ADVISE. If BREAKON, TRACE or ADVISE says the function is not defined and offers you some other function to use instead, it now works to say yes. [K] Reloading files from which some methods have been deleted. If you load a file and some methods that were previously defined in that file are no longer there, you are asked whether to undefine those methods. Undefining the methods may be vital to cause other methods to be inherited where they should be. [L] Changes in Terminal key commands. Terminal M now sets the selected window's **more** processing enable rather than the global one. Terminal >= (Top-M) switches the mouse screen. [M] Reading multi-font files into ZWEI should be much faster. [N] New ZWEI feature for visiting lists of things (callers, etc.) ZWEI commands such as List Callers, List Changed Functions, etc. which give you a list of functions to look at now put the list in a buffer called *Possibilities*. The command C-Shift-P goes to the next possibility in the list; or you can visit the buffer yourself and type C-/ to visit the possibility you are positioned at. You can also move the pointer in that buffer and go back to stepping through with C-Shift-P. As a result, once you have waited for a List Callers to be done, the list remains available to use whenever you wish. Meta-Period also uses this mechanism when there are multiple definitions. Meta-Period with argument is what goes to the next possibility in this case, and the definitions are stored in the buffer *Definitions*. [O] There are three new commands for manipulating patches: M-X Start Patch, Resume Patch and Cancel Patch. Start Patch begins a patch, like Add Patch, but does not put anything in it. This is nearly equivalent to doing Add Patch with an empty region. Resume Patch resumes editing a patch which you started but did not finish (on another machine, or before cold booting). You specify both the name of the system to patch, and the patch version to resume working on. If you had saved the patch buffer before booting, you start off with the latest existing version of the patch file source. Cancel Patch, when you are in the middle of making a patch, removes that patch from the data base; it cancels having begun to make a patch. This is the same as Symbolics's Abort Patch, but that name interferes with the completion of Add Patch, so I believe this name is superior. [P] DRIBBLE-ALL is a new alternate way of saving your terminal i/o. The new function DRIBBLE-ALL opens a dribble file in which all I/O in the current process, including break loops, queries and errors, will be recorded. Close it with DRIBBLE-END like an ordinary dribble file. [Q] Conversation-motion commands in CONVERSE. In CONVERSE, the commands to move up and down by conversations are now M-{ and M-}. The M-[ and M-] keys are left as the usual paragraph commands. The comversation movers are improved, in that they move forward or back until reaching the spot at the end of a To: line. [R] CHAOS:NOTIFY and CHAOS:NOTIFY-ALL-LMS Symbolics generously contributed its functions (CHAOS:NOTIFY host &OPTIONAL message) and (CHAOS:NOTIFY-ALL-LMS &OPTIONAL message) The first sends a notification to the specified host, with the specified message (or one read from the terminal if you omit it). The second sends the same notification to all lisp machines. Note that the function CHAOS:SHOUT is still supported; however, its useis discouraged, since shouting at System 79 users will throw them into Converse! I assume that, by putting these functions in our files, they agree to their unlimited redistribution. [S] DIRED features. When you exit DIRED, you can now type E as an alternative to Y, N or Q. E means go ahead and delete the files (like Q), then expunge the directory. The new command "," in DIRED prints out the attribute list of the file you are pointing at. [T] It is no longer necessary to do TV:SET-TV-SPEED. 60hz is now the default. This speed works fine on CPT monitors as well as VMI's (which was true in earlier system versions as well. CPTs are happy at any speed, during their short lifetimes). [U] Each lisp listener window now has its own binding of PACKAGE. The window remembers its top-level binding of PACKAGE in an instance variable, and provides operations :PACKAGE and :SET-PACKAGE. You can change the package either by doing (PKG-GOTO ...) in the listener's process or by sending a :SET-PACKAGE message. The process and window exchange information just before each time the process does a top-level READ. The global binding of PACKAGE, which is still used for random background processes, is also the initial package for newly created lisp listeners. You can set it, as before, by doing (PROCESS-RUN-FUNCTION "Foo" 'PKG-GOTO package-or-refname) [V] TV:SET-DEFAULT-FONT now works "right". I believe that all existing windows are notified and adjusted properly for the new font. Note that it makes a difference whether a window is using teh default font or using a specific font which happens to be the default at the moment; TV:SET-DEFAULT-FONT will affect the former but not the latter. That is, dependency information is preserved. Note however that menus and labels do not use the default font. They use the standard fonts for menus and labels. You can set those standard fonts by doing (TV:SET-STANDARD-FONT ':MENU font-descriptor) or likewise for ':LABEL. TV:SET-DEFAULT-FONT simply does (TV:SET-STANDARD-FONT ':DEFAULT ...). These standard font names are looked up on the font alist of the screen in use. [W] New feature to allow shift keys to replace double-clicking. For those who don't like double-clicking of mouse buttons, there is a new feature. If you click a mouse button while holding down any of the keys labelled SHIFT, CONTROL, or HYPER, your click will be interpreted as a double-click. Furthermore, if you set TV:MOUSE-DOUBLE-CLICK-TIME to NIL, then double-clicking in the usual way will be disabled, and the system will no longer wait, after you click, to see whether you are going to click again. This can improve mouse-click response time. This feature is under control of the following variable. You can set this variable to NIL if you want to turn off the new behavior (you might want to LOGIN-SETQ it in your INIT file). TV:*MOUSE-INCREMENTING-KEYSTATES* [Variable] The value is a list of the names of those shifting keys which, if held down, will make a single-click of the mouse into a double-click. Its default value is (:SHIFT :CONTROL :HYPER). Holding down two of these keys produces a triple click. This was inspired by the name of the variable; perhaps it works in Brand S also. [X] New feature in Choose-Variable-Values. The Choose-Variable-Values facility has been extended so that the variable specification can be a locative or a cons cell instead of a special variable. This lets arbitrary cells in the machine be examined and modified by Choose-Variable-Values. (If a cons cell is passed, its CAR is the memory location used, and the long form of specification must be used to avoid syntactic ambiguity.) [Y] Hosts not in the host table can be named, as CHAOS|nnnn. It is now possible to name hosts that are not in the host table. The address CHAOS|nnnn, where "nnnn" is an octal numeral (of any length), refers to the host with that number on the Chaosnet. For example, CHAOS|401 and CHAOS|17003 are valid addresses. Normally, all hosts at your site are in the host table and have mnemonic names, so you shouldn't need to use this syntax. However, it comes in useful if your host table is incorrect or out-of-date, in which case you may need to communicate with a host that's not in your host table. [Z] Control-Shift-letter and Meta-Shift-letter in ZWEI: This isn't new, but since I've never seen it documented anywhere, folks might like to know that in ZWEI Control-Shift-letter = Hyper-Control-letter, and Meta-Shift-letter = Hyper-Meta-letter. If you type Control-Shift- it is internally translated into Hyper-Control-, and the latter is what you must use when you call SET-COMTAB to redefine a character. [AA] Help Apropos in ZWEI is now much faster. Also, if a command is not otherwise assigned, it now tells you that it can be invoked via C-M-X, instead of simply saying that is is not on any keys.
Last modified: 2021/08/24 14:29:11 (UTC) by ams