Wednesday February 17,1982 LQ+2D.4H.21M.13S. -- JonL -- 1) In SHARPM 82, #| now works as on the LISPM, namely #|...cruft...|# "disappears" like a balanced comment; note that termination is |# Also, #R now works; e.g. #3R21 is 7 (21 in base 3). 2) Two new functions in auxillary files, but not autoloading DEFCONST is in the MLMAC file; it is like DEFVAR, but always SETQs. ARRAYP is in the MLSUB file; returns true for non-funny arrays. 3) GENTEMP, an LSUBR, generates truly uninterned symbols. Should be used in preference to GENSYM by macros which generate temporary local variables. 4) The TTYNOTES-FUNCTION facility for COMPLR has been emended _______________________________________________________________________ 2) Two new functions in auxillary files, but not autoloading DEFCONST is in the MLMAC file; it is like DEFVAR, but always SETQs. ARRAYP is in the MLSUB file; returns true for non-funny arrays. (defun ARRAYP (x) (and (eq (typep x) 'ARRAY) (memq (array-type x) '(NIL T FIXNUM FLONUM)) 'T)) 3) GENTEMP, an LSUBR, generates truly uninterned symbols. Should be used in preference to GENSYM by macros which generate temporary local variables. GENTEMP permits one optional argument, a prefix for the symbol to be created (defaults to T), and creates a symbol like (maknam (append (explode ) (explode '|..|) (explode ()))) E.g., (GENTEMP) => |T..1| (GENTEMP '|Foo|) => |Foo..1| A basic problem with GENSYM is that even though the symbol is uninterned when created, it may be written out to a FASL during compilation, and upon loading it will then be interned; separate such compilations can thus have unfortunate co-incidences between variables which were thought to be unique. Any symbol with a +INTERNAL-TEMP-MARKER property on its property list will be treated during compilation in such a way that it won't be interned when the FASL file is loaded. 4) The TTYNOTES-FUNCTION facility for COMPLR has been emended If a symbol has a TTYNOTES-FUNCTION property, then that is assumed to be some function which when applied to the symbol will either return a re-nameing of it for the unfasl and ttynotes purposes, or will return () meaning "I've alredy outputted all the msgs I care to see". Currently it doesn't support the re-naming for break-point error msgs. Tuesday April 28,1981 LQ+2D.2H.11M.23S. LISP 2100 / COMPLR 1111 -- JonL -- 1) It now works to place a SFA into the variables TYI and TYO. [more exposition below] 2) YES-OR-NO-P and Y-OR-N-P are two LISPM-compatible LSUBRs, which have been [more exposition below] 3) BUT-TAIL, a new SUBR of 2 arguments, is autoloadable from the file MACAID. [more exposition below] 4) +TYI is a new SUBR of 1 argument, for a super-fast version of TYI. [more exposition below] 5) The feature "BIBOP" has gone away. It is an archaic distinction. 6) (STATUS TTYIFA) and (STATUS TTYOFA) return pointers to the initial, built-in, TTY input file array, and respectively TTY output file array. 7) (INCLUDEF) and (INCLUDE () ) are now no-ops, rather than errors. 8) HERALD, from the MLMAC file, uses the FILE-EXIT-FUNCTIONS facility 9) DEFVST admits two more "options", :CONSTRUCTOR and :NO-SELECTOR-MACROS, and the option-list is parsed the same way as on the LISPM -- [more exposition below] Items affecting only COMPLR C1) A method for individually controlling TTYNOTES information. [more exposition below] C2) New command line switch -- "R" which controls the variable RUNTIME-LIMITP, [more exposition below] C3) Interaction between the switches MACROS and DEFMACRO-FOR-COMPILING: [more exposition below] _______________________________________________________________________ 1) It now works to place a SFA into the variables TYI and TYO. The file QUERIO, when loaded, sets up the variable QUERY-IO to be a "Bi-directional" SFA which can be used as a TTY -- it is normally used by YES-OR-NO-P etc (see note 2 below). Users may use the source code of QUERIO as a guide in writing other SFA's which want to act as filters for the TTY (source on ITS machines is MC:LSPSRC;QUERIO >). 2) YES-OR-NO-P and Y-OR-N-P are two LISPM-compatible LSUBRs, which have been autoloadable for some time now, but which never got documented. See page 163 of the LISPMachine manual. Briefly, they take two optional arguments which are a "stream" onto which to print a "message", and return either T or () depending on whether the user typed the appropriate affirmative response ("Y" in the case of Y-OR-N-P, and "YES" in the case of YES-OR-NO-P); they insist on either the required affirmative or negative response, and will try again if you type something else. The MacLISP version of these functions permit the "stream" and "message" arguments to be in either order, and YES-OR-NO-P ignores any 's typed. 3) BUT-TAIL, a new SUBR of 2 arguments, is autoloadable from the file MACAID. (BUT-TAIL ) assumes that is some nthcdr of , and copys the top level of up to the point of . It is like the LISPM "LDIFF"; 4) +TYI is a new SUBR of 1 argument, for a super-fast version of TYI. Like its counterpart, +TYO, the single argument must be a file-array, a SFA, or the symbol T (which is converted to the value of TYI). Upon reaching End-of-File, +TYI will return -1, but will not close the file, nor run any EOFFN function; if complete EOF action is desired, then one could just use +TYI until it returns -1, and then make one final call with TYI. 8) HERALD, from the MLMAC file, uses the FILE-EXIT-FUNCTIONS facility (see LISP NEWS note of Feb 7,1981) in order to cause the putprop of the VERSION property only when everything is completely and successfully loaded. 9) DEFVST admits two more "options", :CONSTRUCTOR and :NO-SELECTOR-MACROS, and the option-list is parsed the same way as on the LISPM -- Thus, (DEFVST (FOO (:CONSTRUCTOR FLOAT-A-FOO)) ... ) causes FLOAT-A-FOO to be the name of the constructor macro, rather than CONS-A-FOO (or MAKE-FOO). The :NO-SELECTOR-MACROS option causes no macro properties to be output for the selector names; this is preparatory for an interface between DEFSTRUCT and DEFVST. Items affecting only COMPLR C1) A method for individually controlling TTYNOTES information. When compiling using COMPLR, if a symbol has a TTYNOTES-FUNCTION property, then the compiler will call that function, with that symbol as its one argument, instead of printing out on the TTY its usual message "FOO compiled, and assembler" C2) New command line switch -- "R" which controls the variable RUNTIME-LIMITP, initially set to (). If RUNTIME-LIMITP is non-(), then a compilation which "gives up its TTY" (such as by the "D" switch meaning "DISOWN", or such as by having been started from a JCL with no request for TTYNOTEDS) will use the ALARMCLOCK feature to cause a break-loop to occur after RUNTIME-LIMIT microseconds of runtime have elapsed (default initial value of RUNTIME-LIMIT is 6.0e+8, or 10. minutes). As of March 1981, the ALARMCLOCK feature does not work on the TOPS-10/20 versions of MacLISP, but it may soon be implmented for the TOPS-20 one. C3) Interaction between the switches MACROS and DEFMACRO-FOR-COMPILING: Carl Hoffman wants to get the functionaliy of the MacLISP/NIL DEFMACRO into Multics, without having to add any new switches (such as DEFMACRO-FOR-COMPILING etc) to the Multics MacLISP compiler -- as an accommodation to a style of compiler usage whereby the user "pretends" that the switch MACROS is to take over the functionality of DEFMACRO-FOR-COMPILING, I've changed the two occurrences of this latter switch in the DEFMACRO source file into (cond ((boundp 'DEFMACRO-FOR-COMPILING) DEFMACRO-FOR-COMPILING) ((status FEATURE COMPLR) MACROS) ('T)) The normal state in the PDP10 MacLISP world is that DEFMACRO-FOR-COMPILING is set to 'T (even in non-COMPLR lisps), and MACROS is defaultly (); just the opposite case would apparently obtain under Multics, that is DEFMACRO-FOR-COMPILING would be unbound, and MACROS would be T. So, this way, in the PDP10 MacLISP world, if a user has a files of code which don't actually SETQ the switch DEFMACRO-FOR-COMPILING, then he do (MAKUNBOUND 'DEFMACRO-FOR-COMPILING) [possibly in a COMPLR INIT file] and let this switch meaning operate the way CWH will have it do under Multics. Saturday Feb 07,1981 NM+3D.15H.34M.49S. LISP 2071 / COMPLR 1094 -- JonL -- 1) Multiple-value capability implemented thru some autoloadable things: New AUTOLOADable macros and capabilities from MLMAC: MULTIPLE-VALUE, VALUES, MULTIPLE-VALUE-BIND Autoloading SUBRs from file MLSUB: MULTIPLE-VALUE-LIST, VALUES-LIST, and SI:CHECK-MULTIPLICITIES Non-autoloading macros available in MLMAC: MULTIPLE-VALUE-RETURN and RETURN-LIST Reminder: MULTIPLE-VALUE is essentially the same as MSETQ-CALL of previous notes. The names MSETQ-CALL and MSETQ-RETURN will be superseded by the LISPM names; however macros to convert them will be provided in the UMLMAC file (Utility MacLisp MACros). [more exposition below] 2) Additional, new "out-of-core" SUBRs and MACROs: Two LSUBRs "<=" and ">=", of 2 or more args are autoloadable from MLSUB file SOURCE-TRANS properties are set up, in the MLMAC file, for LOGAND, LOGIOR, LOGXOR, LOGNOT, FIXNUMP, FLONUMP, EVENP, <=, >=, <, and >. (see item 4 below for "SOURCE-TRANS"), and these are used to generate some other SUBRs in the MLSUB file: LOGAND, LOGIOR, LOGXOR, LOGNOT, LISTP, FIXNUMP, FLONUMP, and EVENP. Non-autoloading macro available in DEFMAC: DEFUNP Non-autoload versions of FMAKUNBOUND, FSYMEVAL, and FSET are in FUNCEL file. [more exposition below] 3) Default value for DEFUN&-CHECK-ARGS is now (), and whenever &OPTIONAL or &REST args are specified, the "args property" of the symbol will be set. [more exposition below] DEFUN&-CHECK-ARGS is the variable which says whether or not there should be code in the function itself to do number-of-args checking. The interpreter, and "UUO" handler, when in *RSET mode, will check the number of arguments passed to a LSUBR/SUBR against the "args property", which is retrieved and set by the ARGS function. 4) SOURCE-TRANS properties for COMPLR act almost like LISPM "optimizers". [more exposition below] 5) FILE-EXIT-FUNCTIONS is a new global variable which is lambda-bound to the value of FILE-EXIT-FUNCTIONS-DEFAULT by LOAD and FASLOAD. It holds a list of functions of 1 arg to be run at end of loading. [more exposition below] 6) DEFSFA, a macro for defining macros to make SFA usage easier, is now defined in the EXTMAC file (along with DEFCLASS* and DEFMETHOD*) see the documentation file SFA.DOC (on ITS system -- .INFO.;LISP SFA) for full information. _______________________________________________________________________ 1) Multiple-value capability implemented thru some autoloadable things: New AUTOLOADable macros and capabilities from MLMAC: MULTIPLE-VALUE, VALUES, MULTIPLE-VALUE-BIND Autoloading SUBRs from file MLSUB: MULTIPLE-VALUE-LIST, VALUES-LIST, and SI:CHECK-MULTIPLICITIES Non-autoloading macros available in MLMAC: MULTIPLE-VALUE-RETURN and RETURN-LIST Reminder: MULTIPLE-VALUE is essentially the same as MSETQ-CALL of previous notes. The names MSETQ-CALL and MSETQ-RETURN will be supersede by the LISPM names; however macros to convert them will be provided in the UMLMAC file (Utility MacLisp MACros). Frequently, it is convenient to think of a function as returning several values; in LISP, one often just constructed a list of the several item, and the calling function would "destructure" that list. The basic special forms MULTIPLE-VALUE and VALUES are provided to indicate respectively a function call which is expected to return (possibly) multiple values, and a function exit which does provide (possibly) multiple values. Cooperation is achieved through a "return-values vector", which in MacLISP is just a collection of several special variables. MULTIPLE-VALUE is somewhat like SETQ in that the multiple-values returned by the call will be set into some variables; e.g., (MULTIPLE-VALUE (AVERAGE MAX STANDARD-DEVIATION) (STATISTICS-GATHERER x1 y1 ...)) might set up three values in the variables AVERAGE, MAX, and STANDARD-DEVIATION, but without requiring an intermediate list of results. Similarly, (MULTIPLE-VALUE-BIND (AVERAGE MAX STANDARD-DEVIATION) (STATISTICS-GATHERER x1 y1 ...) (do-something ...) ... (do-last-thing ...)) provides a lambda-binding, rather than a setting, of the variables, over the enclosed scope. Also, for example, the routine STATISTICS-GATHERER might look like (DEFUN STATISTICS-GATHERER (a1 a2 ...) ... ;lotta work here! (VALUES (//$ SUM N) HIGHEST (COMPUTE-SD))) The value of the form (MULTIPLE-VALUE (X ...) ...) is the thing which got set to X; since destructuring works with MULTIPLE-VALUE, then (MULTIPLE-VALUE (() Y ...) ...) returns the thing which would have been set to the first variable, had it not been (). MSETQ-CALL and MSETQ-RETURN are being superseded by the LISPM names, which are now essentially equivalent; minor differences are noted by an occurrence of **** in the documentation here below. 1a) MULTIPLE-VALUE, in MacLISP, macroexpands into code to setq the requested variables to the multiple values returned by a function call. E.g. (MULTIPLE-VALUE (FORM EX?) (MACROEXPAND-1*M FORM)) calls a macroexpander which returns two values -- the first is the possibly expanded form, and the second is a flag saying whether or not any expansion really happened. If there aren't enough returned values to set all the indicated variables, the default action of the MacLISP facility is to pad out with ()'s (same as on LISPM); however, **** if the global variable SI:CHECK-MULTIPLICITIES is set to CERROR, an error will be signalled instead. See the discussion under item 4 below. 1b) VALUES is a new LISPM special form, and in NIL/MacLISP it is essentially the same thing as MSETQ-RETURN was; its basic action is to set up a "return-values vector"; typical usage would be to call VALUES as the last form in a lambda-expression. Example: (DEFUN TWIST (X Y) (COND ((AND (NUMBERP X) (NUMBERP Y)) (VALUES 'T (LESSP X Y))) ('T (SETQ X (TO-STRING X) Y (TO-STRING Y)) (VALUES () (ALPHALESSP X Y))))) 1c) MULTIPLE-VALUE-LIST constructs a list of all the (possibly multiple) values returned by the evaluated sub-form. Format of usage is like (MULTIPLE-VALUE-LIST ( ...)) where should return some (possibly multiple) values. 1d) RETURN in MacLISP still admits only one argument **** -- in order to do a RETURN with multiple arguments, do (RETURN (VALUES first second ...)) MULTIPLE-VALUE-RETURN is primitive on the LISPM, but is macro expanded in MacLISP to use merely RETURN. Currently, RETURN (but not MULTIPLE-VALUE-RETURN) is primitive in MacLISP, and this causes one incompatibility -- (RETURN (VALUES ...)) on the LISPM might return only one value, but in MacLISP it will return as many values as are provided by the VALUES; also, if FOO is a function returning multiple values, then (RETURN (FOO)) will "pass them all thru" doing essentially what MULTIPLE-VALUE-RETURN does on the LISPM. 1e) VALUES-LIST is a SUBR of one argument, a list, which it "spreads out" into the "return-values vector"; Thus (VALUES-LIST '(1 B 3)) is the same as (VALUES 1 'B 3). RETURN-LIST macroexpands into something like (MULTIPLE-VALUE-RETURN (VALUES-LIST ...)) As mentioned above for MULTIPLE-VALUE-RETURN, there is the implicit LISPM/MacLISP incompatibility about RETURN. 1f) MULTIPLE-VALUE-BIND -- a form is to be evaluated, returning several values, and *then* a lambda-binding contour is created, with the values bound to some variables; following that, the body of and implicit PROGN is executed. Example: (MULTIPLE-VALUE-BIND (A B C) (GET-THREE-VALS ...) (COGITATE-UPON A) (LIST B C)) 1G) SI:CHECK-MULTIPLICITIES **** is called whenever MULTIPLE-VALUE or MULTIPLE-BIND have more variables than there are returned values; the value of SI:CHECK-MULTIPLICITIES, as a variable, then determines what to do (default setting is null): () -- means pad out unsupplied multiple-return-values with nulls; CERROR -- means run an error if not enough values supplied; any thing else should be a function to funcall with an argument which is the number of variables minus one (*:ARn contains the actual number of returned values). Remember also that MULTIPLE-VALUE depends upon a "return-values vector" being set up by the function called, and thus constructs like (MULTIPLE-VALUE (v1 v2) (PROG1 (MANY-VALUED-FUN a1 a3) (SOMETHING-ELSE))) will not work in general; a correct way to do this particular example is (LET (unique-var-1 unique-var-2) (MULTIPLE-VALUE (unique-var-1 unique-var-2) (MANY-VALUED-FUN a1 a3)) (SOMETHING-ELSE) (SETQ v1 unique-var-1 v2 unique-var-2) v1) This "fault" of side-effecting also applies to MULTIPLE-VALUE-LIST. The multiple-value functions operate quite efficiently for 8 or fewer return values -- many of them are "open-coded" by virtue of the code produced by the macroexpansions. Any returned values more than 8 are passed via a cons'ing mechanism. Degenerate forms will generally work OK, provided they make sense; e.g. (VALUES FOOBAZ) is just the same as FOOBAZ, except the internal "number-of-extra-return-values" variable is set up; (MULTIPLE-VALUE (X) ...) again will turn out pretty much like an ordinary SETQ, and (MULTIPLE-VALUE () (FOO)) will turn out pretty much like (FOO), except that the internal count variable is set up. 2) Additional, new "out-of-core" SUBRs and MACROs: Two LSUBRs "<=" and ">=", of 2 or more args are autoloadable from MLSUB file SOURCE-TRANS properties are set up, in the MLMAC file, for LOGAND, LOGIOR, LOGXOR, LOGNOT, FIXNUMP, FLONUMP, EVENP, <=, >=, <, and >. (see item 4 below for "SOURCE-TRANS"), and these are used to generate some other SUBRs in the MLSUB file: LOGAND, LOGIOR, LOGXOR, LOGNOT, LISTP, FIXNUMP, FLONUMP, and EVENP. Non-autoloading macro available in DEFMAC: DEFUNP Non-autoload versions of FMAKUNBOUND, FSYMEVAL, and FSET are in FUNCEL file. Each of <= and >= take two or more arguments; in addition, SOURCE-TRANS properties are set up for <=, >=, < ,and > so that the case of three or more arguments are "wrapped up in a LAMBDA" and the basic open-coding action of the COMPLR on the binary version can be used. NILAID permits usage of any of <, <=, >=, >, <$, <=$, >=$, and >$ with two or more arguments; the "$" versions are for floating-point. In conjunction with the functions which get SOURCE-TRANS properties from the MLMAC file, there are SUBR definitions of them in this file (MLSUB, which is acronymic for "MacLisp SUBrs"): LOGAND, LOGIOR, LOGXOR, LOGNOT, FIXNUMP, FLONUMP, and EVENP. For example, the definition of EVENP can be (DEFUN EVENP (X) (EVENP X)) because the SOURCE-TRANS's cause "(EVENP X)" to expand into "(NOT (ODDP X))"; similar tactics are used for multiple-argumented funtions like LOGXOR etc. Non-autoloading macro available in DEFMAC: DEFUNP As on the LISPM, (DEFUNP FOO () e1 e2 ... en) macroexpands into (DEFUN FOO () (PROG () e1 e2 (RETURN en))) Non-autoload versions of FMAKUNBOUND, FSYMEVAL, and FSET are in FUNCEL file. By loading in the EXTEND feature, a pseudo SUBR object can be created and manipulated; thus reasonable versions of the LISPM/NIL functions FMAKUNBOUND, FSYMEVAL, and FSET are implemented. This facility is pre-loaded into NILAID. 3) Default value for DEFUN&-CHECK-ARGS is now (), and whenever &OPTIONAL or &REST args are specified, the "args property" of the symbol will be set. DEFUN&-CHECK-ARGS is the variable which says whether or not there should be code in the function itself to do number-of-args checking. The interpreter, and "UUO" handler, when in *RSET mode, will check the number of arguments passed to a LSUBR/SUBR against the "args property", which is retrieved and set by the ARGS function. 4) SOURCE-TRANS properties for COMPLR act almost like LISPM "optimizers". It is now possible to carry out "code-transformations" in COMPLR by means of the SOURCE-TRANS mechanism. When compiling a form whose CAR is a symbol, the compiler will check for a SOURCE-TRANS property on the symbol. The value of this propery should be a list of transformation routines, each of which must be a function of one argument. Furthermore, each transformation routine must return two values (e.g., via VALUES), the first being the transformed form and the second being a flag which, when non-null, indicates that the transformation routine has "done something". The compiler applies each transformation routine in turn, passing the form to be transformed as the sole argument. If the transformation routine returns a second value of () then it is considered to have "done nothing" and the next transformation routine is tried; otherwise the routine is considered to have "done something" and the entire process begins anew with the first transformation routine. The transformation of the original form is complete only after all transformation routines have been tried and "done nothing". This transformation procedure is carried out fully before any macro expansion is attempted. Note well, that this differs from the LISPM facility in that the translating functions *must* return at least two values. 5) FILE-EXIT-FUNCTIONS is a new global variable which is lambda-bound to the value of FILE-EXIT-FUNCTIONS-DEFAULT by LOAD and FASLOAD. It holds a list of functions of 1 arg to be run at end of loading. The argument supplied to each function is null if loading completed successfully; otherwise it is the file-array of the file being aborted. This provision uses the UNWIND-PROTECT mechanism, so these functions will be called even if the file is aborted by ^G or *THROW. The initial setting of FILE-EXIT-FUNCTIONS-DEFAULT is null, so if you set it to something else, those functions will be run at the end of every file loading; typically, a file itself may push forms onto FILE-EXIT-FUNCTIONS to provide for individual "cleanup". Friday, Dec 5,1980 LQ+5D.18H.52M.7S. LISP 2057 - JonL - 1) Seven items of previous LISP RECENT (dated Oct 28,1980) have been emended: 1a) Documentation available for (STATUS USRHUNK) etc. 1b) Both " and # are set up in the initial environment as readmacros. 1c) CATCH and THROW are now autoloading macros from LISP:MLMAC. 1d) Warnings about MacLISP incompatibilites with NIL, and how to overcome the most common ones. 1e) +INTERNAL-PERMUTIBLE-P is an autoloading subr from LISP:MACAID. 1f) PAIRP and FBOUNDP are now initial system subrs; (PAIRP x) is the same as (EQ (TYPEP x) 'LIST), and (FBOUNDP x) is non-null iff x is a symbol with a functional "property". 1g) Several "internal" subrs exist to augment compiled code: *LDB, *DPB, *LOAD-BYTE, and *DEPOSIT-BYTE 1h) At user level, the function's name is FIND-METHOD (rather than SI:...) Also the names now are SI:MAKE-EXTEND, SI:EXTEND, SI:EXTEND-LENGTH, SI:XREF, and SI:XSET rather than the *:<...> versions. [more exposition below] 2) ** Incompatible change**" ARRAYDIMS called on a "NIL" type array will return (NIL ...) instead of (T ...) as formerly. New Functions, as on the LISPMachine: (ARRAY-DIMENSION-N ) gets i'th dimension number of (ARRAY-/#-DIMS ) gets the number of dimensions (ARRAY-TYPE ) is the same as (CAR (ARRAYDIMS )) 3) DEFVST "macros" now all share code to minimize space. Interpretive access to structure components checks the type of the struct. New macros STRUCT-LET and STRUCT-SETF have featureful convience. [more exposition below] 4) Three new functions autoloadable from DEFMAX file: MACROEXPAND-1*M is a multiple-value returning subr of 1 arg called like (MSETQ-CALL (X ?) (MACROEXPAND-1*M Y)) +INTERNAL-TRY-AUTOLOADP a subr of 1 argument autoloadable from DEFMAX, tries to autoload a function's autoload file, if it has one. FLUSH-MACROMEMOS -- to flush the macromemo "cache"; and some new settings for the switch DEFMACRO-DISPLACE-CALL [more exposition below] 5) Some more LISPM-compatible autoloadable facilities, and error facilities. CERROR, FERROR, and ERROR-RESTART as on LISPM, from LISP:CERROR file. also a new subr +INTERNAL-LOSSAGE of three args, for use when an "unreasonable" point is reached. Y-OR-N-P from LISP:YESNOP file, for interactive querying. New "error-checking" routines from LISP:ERRCK file Documentation below for CHECK-TYPE and CHECK-SUBSEQUENCE. [more exposition below] 6) SXHASH may dynamically be adjusted to be more anti-symmetric [more exposition below] 7) LOOP and DEFINE-LOOP-PATH are now autoloading See the documentation file .INFO.;LISP LOOP, or the LCS Technical Report "LOOP Iteration Macro" MIT/LCS/TM-169. 8) DELASSQ, a new LSUBR of 2 or three args, is a cross between DELQ and ASSQ (DELASSQ 'A '((A . 1) (B . 2) (A . 3))) ==> ( (B . 2) ) but remember, that like DELQ, rplacds are being done. 9) #(...) notation is usable now whenever the VECTOR package is loaded; the print method for vectors generatates this syntax, and # will read it. #B is usabe when the BITS package is loaded; #T is usable when the EXTEND packages is loaded (any new NIL data type usage will load EXTEND). In MacLISP, #T is synonymous with T. #*400000000* now reads in correctly. 10) Four new internal subrs, to help with various STRING packages: +INTERNAL-CHAR-N +INTERNAL-RPLACHAR-N +INTERNAL-STRING-WORD-N +INTERNAL-SET-STRING-WORD-N [more exposition below] 11) Value of the variable PURCOPY is a list of things which the PURCOPY function should not actually copy. For example, CLASS objects should never be moved, and hence can't be PURCOPYied. 12) The function SQOZ/| is no longer part of the basic system -- it is defined in the GETMIDASOP file. For TWENEX users: X1) Twenex MacLISP offers a parsable "init file" facility now CURSORPOS and "rubout" of TTY input now work on systems with VTS [more exposition below] ____________________________________________________________________________ 1) Six items of previous LISP recent have been emmended significantly: 1a) Documentation available for (STATUS USRHUNK) etc. 1b) Both " and # are set up in the initial environment as readmacros. 1c) CATCH and THROW are now autoloading macros from LISP:MLMAC. 1d) Warnings about MacLISP incompatibilites with NIL, and how to overcome the most common ones. 1e) +INTERNAL-PERMUTIBLE-P is an autoloading subr from LISP:MACAID. 1f) PAIRP and FBOUNDP are now initial system subrs; (PAIRP x) is the same as (EQ (TYPEP x) 'LIST), and (FBOUNDP x) is non-null iff x is a symbol with a functional "property". 1g) Several "internal" subrs exist to augment compiled code: *LDB, *DPB, *LOAD-BYTE, and *DEPOSIT-BYTE 1h) At user level, the function's name is FIND-METHOD (rather than SI:...) Also the names now are SI:MAKE-EXTEND, SI:EXTEND, SI:EXTEND-LENGTH, SI:XREF, and SI:XSET rather than the *:<...> versions. 1a) Four new STATUS calls permit hooks into system functions, when given hunks as arguments -- used as the basis of the EXTEND system, as the LISP RECENT note of Oct 28,1980, item 3. See the documentation file ".INFO.;LISP SEND" on ITS systems and "LISP:SEND.DOC" on TOPS-10/20 systems. See also ".INFO.;LISP EXTEND" on ITS systems and "LISP:EXTEND.DOC" TOPS-10/20 systems. (SSTATUS USRHUNK ) specifies the "user hunk" predicate, which determines whether to "hook into" a user-provided definition for some system facility, or to treat the data strictly as a hunk. (SSTATUS SENDI ) specifies a "SEND" interpreter -- is invoked in order to send a "message" to a "user hunk", when a hunk which passes the "usrhunk" test is given as argument to any of EQUAL SUBST PURCOPY EVAL PRINT EXPLODE FLATSIZE ALPHALESSP SAMEPNAMEP NAMESTRING SXHASH or to any of the following out-of-core facilities GFLATSIZE SPRINT USERATOMS-HOOK DESCRIBE WHICH-OPERATIONS See the file LISP:SEND.DOC (or .INFO.;LISP SEND on ITS systems) (SSTATUS CALLI ) specifies a "transfer function" to be used when when a "user hunk" is FUNCALL'd. This is a hand-coded substitute for the IAPPLY internal LISP routine. See the file LISP:SEND.DOC (or .INFO.;LISP SEND on ITS systems) (SSTATUS VECTOR `( )) specifies the functions for LEXPR-FUNCALL to use for determining if the argument to be spread is a vector, determining its length, and accessing its elements. This allows one to do (LEXPR-FUNCALL #'LIST 'A 'B #(C D E)), for example, yielding (A B C D E). 1b) Both " and # are set up in the initial environment as readmacros. # still requires the file LISP:SHARPM.FASL, but the default function for " will still create a pseudo-string (un-intern'd symbol) rather than requiring the full STRING support package; loading in the file LISP:STRING.FASL will do a SETSYNTAX on " to get real STRINGs. 1c) CATCH and THROW will expand according to the old syntax, but someday this may change; currently (CATCH exp tag) ==> (*CATCH 'tag exp) and similarly for THROW. 1d) A MacLISP pre-loaded with most of the NIL facilities, is obtained by running the subsystem NILAID (NILAID^K on ITS systems); this is more- or-less a union of the MacLISP and NIL facilities, but one must remember the following incompatibilities: (1) The nullist is identified with the symbol |NIL| in MacLISP, but has a unique new data type in NIL, so NIL code which depends on the non-symbolness of the nullist wil lose -- check your usages of SYMBOLP. (2) The function atom is "false" for hunks in MacLISP, and thus is "false" for STRINGs, VECTORs and all other data embedded into the USRHUNK feature, so it would be more compatible to use (PAIRP X) rather than (NOT (ATOM X)), if you want to distinguish cons cells. The function LISTP is equivalent to (OR (NULL X) (PAIRP X)). (3) FBOUNDP in NIL will only return "true" or "false" -- namely #T or () -- but in MacLISP, it returns the information from the GETL function, when "true"; thus there is more information in the MacLISP result. Since there are no real SUBR objects in MacLISP, the result of FSYMEVAL will not be compatible; but used in limited ways, it will work, e.g. (FSET 'MUMBLE (FSYMEVAL x)). (4) CATCH (and THROW) in MacLISP still has the old semantics, but in NIL and NILAID it has the new, namely the same as *CATCH (and *THROW); use the * versions and be safe. (5) CASEQ will not work on CHARACTER objects in MacLISP (6) DEFUN will not keep track of the "documentation" string. (7) No real package system is set up -- so GET-PNAME merely returns the portion of a pname-string following the first ":" (if any). 1e) +INTERNAL-PERMUTIBLE-P is an autoloading subr from LISP:MACAID. (+INTERNAL-PERMUTIBLE-P l) is non-() iff the forms on the list 'l' may be EVAL'd in any order, and get the same results/effects. For example (5 (MUMBLE X)) is permutible, since nothing which happens inside MUMLBE can affect the value of 5; but (X (RPLACA Y)) is not permutible, since X may point to a list which is updated by the RPLACA. 1g) Currently, the compiler may turn LDB into a call to the internal subr *LDB, which has args the same as LDB except the "ppss" arg has been lsh'd by 30. places (also, no type-checking is done on the args). Similar remarks apply for *DPB, *LOAD-BYTE, and *DEPOSIT-BYTE. Another alternative is that it may turn LDB into a LSH followed by a LOGIOR. Someday, it may open-code these into an actual pdp10 LDB. 1h) For a certain amount of time, the EXTEND file will probably also put macro definitions on *: to become SI:, the names EXTEND, EXTEND-LENGTH, MAKE-EXTEND, XREF, and XSET. 3) DEFVST "macros" now all share code to minimize space. Interpretive access to structure components checks the type of the struct. New macros STRUCT-LET and STRUCT-SETF have featureful convience. Accessor macros for a structure generally gave rise to a modest amount of code, but a new scheme has just been implemented in which all such macros use precisely one function; each accessor macro, or constructor macro, needs only two properties on its property list -- a MACRO property pointing the the single expander function, and a small SELECTOR or CONSTRUCTOR property. Similarly, the output of the DEFVST macro is significantly smaller, due to calling an initialization function which will be autoloaded when needed, rather than expanding out lots of lisp code. In interpreter usages of selector "macros" (in *RSET mode) the code will certify that a selector macro is being applied to a structure of the correct type; if not, a proceedable error will be performed. STRUCT-LET and STRUCT-SETF have been devised to facilitate multiple settings, or gettings, of structure components. For example, suppose DESK is a strucure with four components, defined like (DEFVST DESK A B C D), and suppose that is a DESK possibly created by (SETQ (CONS-A-DESK C 'FULL)). Then (STRUCT-SETF (DESK ) (A 'PAPER) (B 25.) (D (folders))) expands into a short program to fill in the DESK-A, DESK-B, and DESK-D components of . Also (STRUCT-LET (DESK ) (A (D) (MIDDLE-DRAWER B)) ... do-some-work ... ) would lambda-bind the variables A, D, and MIDDLE-DRAWER respectively to the DESK-A, DESK-D and DESK-B components of and then do further work, indicated like the implicit progn of a LET. The code for DEFVST has been split up into three files. The new file DEFVSX (and auxillary file for structure usage) contains various common selector-macro expansion functions, constructor functions, etc; the file DEFVST now contains only the DEFVST macro itself, and all the various "methods" applicable to objects in the class STRUCT-CLASS. It should be possible to have a file of code which defines and uses structures, but which when compiled needs neither file loaded; the DEFVSX file would be loaded if in the resultant object environment it becomes necessary to expand any accessor/constructor macros at runtime. One needn't have DEFVST loaded except when compiling, or when wanting the more refined methods available through the EXTEND class hierarchy (as opposed to treating structures merely as hunks). The third file is DEFVSY, and is loaded whenever the output of DEFVST, in the runtime environment, actually is constructing up new instances of a defined structure. DEFVSY takes about 250. words of binary program space, and thus will probably "pay for itself" in terms of the code saved in the CONS-A-foo expansions. DEFVSX takes about 590.; and DEFVST takes about 1040. DEFVST created structures interface into the MacLISP (and NIL) CLASS system, but they do not load it if not already loaded. Structure instances created before the CLASS system is loaded will leave around a "skeleton" class, which the cooperating EXTEND file will "flesh out" when it is loaded. Typical usage of structures should cause no overhead in the run-time environment except possibly the DEFVSY file and a few "skeletal" classes. 4) Three new functions autoloadable from DEFMAX file: MACROEXPAND-1*M is a multiple-value returning subr of 1 arg called like (MSETQ-CALL (X ?) (MACROEXPAND-1*M Y)) +INTERNAL-TRY-AUTOLOADP a subr of 1 argument autoloadable from DEFMAX, tries to autoload a function's autoload file, if it has one. FLUSH-MACROMEMOS -- to flush the macromemo "cache"; and some new settings for the switch DEFMACRO-DISPLACE-CALL MACROEXPAND-1*M does one step in the macroexpansion of its argument, and returns that expansion (or the original form if it didn't represent a macro call, and also returns a flag, T or (), telling whether or not any expansion was done. The argument to +INTERNAL-TRY-AUTOLOADP should be a symbol; it tries to load in the file from the autoload property of its argument, if there is one. Non-null return value iff it did the loading. A user may request flushing all the "cacheings" for expansions of a macro FOO by doing (FLUSH-MACROMEMOS 'FOO () ), and may flush all "cacheings" by (FLUSH-MACROMEMOS () () ). Here, the word "flush" really means "invalidate", and generally nothing is done during "flushing" except updating some validation counter. This problem may be more thoroughly described by the following explanation. When DEFMACRO is used to define a macro, the value of thes witch DEFMACRO-DISPLACE-CALL determines whether the original cell which started out with a macro call will be displaced, either by the result of the macro expansion directly, or by an "expanded" marker which acts like a "cache" for the expansion; a third alternative is not to displace, but to enter into a hash table. A problem arises in trying to determine when to invalidate such "cache" or hash-table entries; clearly, such an invalidating must be done when the particular macro is redefined, but many macros call the function MACROEXPAND, and hence the value of their expansion would likely be changed by redefining some other (totally random?) macro. As a step in solving this problem, the durrent DEFMAX code recognized four conditions -- A "cached" or hash-tabled expansion which becomes invalid: 1) Only when the particular macro which gave rise to it is redefined. 2) When any macro is re-defined (including the one for which the expansions itself was done). All formerly compiled DEFMACROs will currently fall into this category. 3) When a new structure is defined (by means of DEFVST); this would be the case for a generalized structure-hacking macro such as STRUCT-LET, which utilizes information about a structure being decomposed, as well as any sub-macroexpansions. 4) When the user requests that all "cacheings" for this particular macro, say FOO, be flushed -- this can now be done by (FLUSH-MACROMEMOS 'FOO () ) -- or when the user requests that all "cacheings" or hash-tableings be invalidated; this can now be done by (FLUSH-MACROMEMOS () () ). Currently, a test of the switch DEFMACRO-DISPLACE-CALL at performed at macro-definition time to determine which one of 1-3 will be the case: (EQ DEFMACRO-DISPLACE-CALL MACROEXPAND) -- case 1 (EQ DEFMACRO-DISPLACE-CALL '|defvst-construction/||) -- case 3 (NULL DEFMACRO-DISPLACE-CALL) -- no "cacheing" (EQ DEFMACRO-DISPLACE-CALL 'DEFMACRO-DISPLACE) -- direct displace any other value for DEFMACRO-DISPLACE-CALL -- case 2 Note that the value which selects case 1 is not the (interned) symbol MACROEXPANDED, but its value as a global variable; this is a "safety" feature so that one will be less likely to get case 1 accidentally. Also note that the second argument to FLUSH-MACROMEMOS, if not null, is a signal to set up the right kind of flusher: case 1 -- 'FLUSH-MACROMEMOS case 2 -- value of MACROEXPEND case 3 -- '|defvst-construction/|| 5) Some more LISPM-compatible autoloadable facilities, and error facilities. CERROR, FERROR, and ERROR-RESTART as on LISPM, from LISP:CERROR file. also a new subr +INTERNAL-LOSSAGE of three args, for use when an "unreasonable" point is reached. Y-OR-N-P from LISP:YESNOP file, for interactive querying. New "error-checking" routines from LISP:ERRCK file Documentation below for CHECK-TYPE and CHECK-SUBSEQUENCE. Only CHECK-TYPE, CHECK-SUBSEQUENCE and +INTERNAL-LOSSAGE aren't documented in the LISPM manual. The first two are macros which produce code calling some internal subrs. CHECK-TYPE takes a variable name (which it "quotes"), a function usable as a type-testing predicate, and a symbol naming the routine which wants the test done. CHECK-SUBSEQUENCE sets up a multiple return value call and thus wants a list of variable names (again "unquoted"), the name of a sequence type such as LIST, VECTOR, STRING or BITS (or null which means any "sequence" is acceptable), and the name of the routine which wants the test done. In each case, the macro produces code to pass the "variables" to the internal checker, and to setq them to the possibly-corrected return values; if the type of the main argument isn't correct, a :WRONG-TYPE-ARGUMENT condition is signalled to CERROR, and the corresponding variable is set to the returned value; similarly, if the subsequence designated by the two more variables for "start index" and "number of items" doesn't lie within the main argument, then a :INCONSISTENT-ARGUMENTS condition is signalled. Examples: (CHECK-TYPE X #'FLONUMP 'Hooperbylic-SIN) (CHECK-SUBSEQUENCE (IN-STRING 1ST-CHAR-INDEX NCHARS) 'STRING 'MY-DOIT) The "number of items" variable may be written as (), in which case the check is merely that the index is valid for the sequence; also, it may be calculated up by the internal routine to coincide with the end of the sequence, by passing an optional 5th arg of (). E.g. (CHECK-SUBSEQUENCE (IN-STRING 1ST-CHAR-INDEX HAUMANY) 'STRING 'MY-DOIT () () ) would have one effect like (SETQ HAUMANY (- (STRING-LENGTH IN-STRING) 1ST-CHAR-INDEX)) +INTERNAL-LOSSAGE is for use when system code is admittedly incomplete, or some unfathomable point has been reached. (+INTERNAL-LOSSAGE ) will print a message identifying this point, and run a FAIL-ACT error. should be an identifier, and should be the name of the function which is complaining; if non-() may be an associated piece of data. 6) SXHASH may dynamically be adjusted to be more anti-symmetric It seems that most persons are in favor of a change in the SXHASH algorithm which would break its current symmetric behaviour on lists; as the consequences of making this change are rather light, we offer a status call which will dynamically do it; but the initial setting is still the old way. Someday soon, we may set the default state to be this new anti-symmetric version. The consequences of having two different sxhash'ers for lists are primarily that extra space may be taken when loading in previously compiled files, or when using the EXPR-HASH feature; thus the change-over will likely be co-ordinated with a massive re-compilation of all system FASL files, and probably all MACSYMA files. (SSTATUS SXHASH 'T), the current default, causes SXHASH to maintain compatibility with the algorithm prior to the date Nov 3, 1980; (SSTATUS SXHASH () ) activates the new alogrithm (defun SXHASH-FOR-LIST (x) (+ (rot (sxhash (car x)) 11.) (rot (sxhash (cdr x)) 7))) Note that the use of an output from sxhash should be such that "all bits are considered". For example, if you want to reduce the range further to something less than the 36-bit 2's complement number that comes out, don't just take the low 18. bits or something like that, but take the remainder upon division by a suitable prime. 10) Four new internal subrs, to help with various STRING packages: +INTERNAL-CHAR-N +INTERNAL-RPLACHAR-N +INTERNAL-STRING-WORD-N +INTERNAL-SET-STRING-WORD-N The first two are interrupt-protected, non-checking versions of CHAR-N and RPLACHAR-N; the second two are similar, but deal with PDP10 words rather than characters. STRAUX (the STRing AUXillary file) will guarantee that these functions exist, either by noting their presence in the lisp system, or by supplying a somewhat-less-than-perfect version itself. X1) Twenex MacLISP offers a parsable "init file" facility now CURSORPOS and "rubout" of TTY input now work on systems with VTS As with MacLISP other on operating-systems, a space right after the subsystem name causes supression of the init facility. Thus, @MACLISP ;gets the default, LISP.INI, if it exists @MACLISP ;stops the search for an init file. @MACLISP FOO.BAR ;gets FOO.BAR as a LISP.INI file TOPS-20 systems may soon get the Virtual Terminal Service developed by Mike Travers at MIT-XX (now with Foonly); MacLISP uses it to achieve CURSORPOS and a "rubout" facililty for type-in Tuesday Oct 28,1980 FM+4D.17H.18M.10S. LISP 2033 - Jonl - 1) Some new functions: ASH is a SUBR of two (fixnum) arguments, and is open-coded by the compiler. MAKE-LIST is a SUBR of one (fixnum) argument. LOAD-BYTE, DEPOSIT-BYTE, LDB, and DPB are now installed as SUBR's. LEXPR-FUNCALL, an LSUBR, follows the LISPMachine definition [more exposition below] 2) Many new autoloadable functions and macros: Macros from LISP:MLMAC -- HERALD SELECTQ IF DEFVAR CATCH THROW PSETQ SETQ-IF-UNBOUND MSETQ-CALL MSETQ-RETURN WITHOUT-INTERRUPTS WITH-INTERRUPTS WITHOUT-TTY-INTERRUPTS Macros from LISP:MACAID -- DEFSIMPLEMAC DEFBOTHMACRO Functions from LISP:MACAID -- +INTERNAL-DUP-P +INTERNAL-PERMUTIBLE-P |constant-p/|| |carcdrp/|| |no-funp/|| |side-effectsp/|| SYMBOLCONC FLATTEN-SYMS [more exposition below] 3) A user-extensible data-type scheme, using NIL's EXTEND data type, and with a hierarchical CLASS system. See also the documentation file ".INFO.;LISP EXTEND" on ITS systems and "LISP:EXTEND.DOC" on TOPS-10/20 systems. (The "USRHUNK" facility is required, and is take over by this CLASS system -- see 5 below). The autoloadable parts are: Functions from LISP:EXTEND -- PTR-TYPEP EQ-FOR-EQUAL? SI:DEFCLASS*-1 ADD-METHOD FIND-METHOD WHICH-OPERATIONS DESCRIBE Functions (with compile-time macro definitions) from LISP:EXTBAS ("basic") EXTENDP SI:MAKE-EXTEND SI:XREF SI:XSET SI:EXTEND-LENGTH SI:EXTEND (no macro definition) Macros from LISP:EXTMAC -- DEFCLASS* DEFMETHOD* MAKE-A-METHOD TYPECASEQ plus all accessor macros for CLASS objects Functions from LISP:SUBSEQ -- SUBSEQ REPLACE TO-LIST TO-VECTOR TO-STRING TO-BITS Functions and macros from LISP:EXTSTR ("structures") SI:DEFCLASS*-2 **SELF-EVAL** **CLASS-SELF-EVAL** [more exposition below] 4) Non-autoloadable Macros and Functions of general utility, from LISP:UMLMAC FIXNUMP FLONUMP LISTP EVENP LOGAND LOGIOR LOGXOR LOGNOT BIT-TEST BIT-SET BIT-CLEAR WHEN UNLESS DOLIST DOTIMES <= >= [more exposition below] 5) [delete -- discussed under item (1a) in note of Dec 04,1980] 6) A few piddling minor changes: 6a) There is now a PDP10 on the (STATUS FEATURES) list. 6b) Both " and # are set up in the initial environment as readmacros. # still requires the file LISP:SHARPM.FASL, but the default function for " will still create a pseudo-string (un-intern'd symbol) rather than requiring the full STRING support package; loading in the file LISP:STRING.FASL will do a SETSYNTAX on " to get real STRINGs. 6c) SETF is gone as an FSUBR -- the macro definitions is now autoloading. 6d) (STATUS NOINTERRUPT) returns the current state of the NOINTERRUPT flag. (SSTATUS NOINTERRUPT ) is like (NOINTERRUPT ), but slower. 7) New variable GRLINEL controls GRINDEF -- formerly the linewidth to be used while grinding was computed from (LINEL (OR (CAR OUTFILES) T)) As this is only a heuristic, the variable GRLINEL (default UNBOUND) will have priority if it is bound to a value. ____________________________________________________________________________ 1) Some new functions: ASH is a SUBR of two (fixnum) arguments, and is open-coded by the compiler. MAKE-LIST is a SUBR of one (fixnum) argument. LOAD-BYTE, DEPOSIT-BYTE, LDB, and DPB are now installed as SUBR's. LEXPR-FUNCALL, an LSUBR, follows the LISPMachine definition ASH is the "harmful operation" of arithmetic shifting. Many computer people have been led into thinking that ASH can substitute for multiply (or divide) when the multiplier (divisor) is a power of two; this is a "harmful thought", as the following analysis shows. (ASH ) is like *2^ for non-negative , and almost like /2^<-n> for negative -- if is also negative then it is like [+2^<-n>-1]/2^<-n>. Many out-of-core functions need a function which generates a list of nulls; hence: (MAKE-LIST 0) ==> () (MAKE-LIST ) ==> `( () ,.(make-list )) LOAD-BYTE etc have been described in previous notes, but now LOAD-BYTE, DEPOSIT-BYTE, LDB, and DPB are now installed as SUBR's. The COMPLR open-codes some cases as BOOLE's [e.g., (LDB 0203 X) ==> (BOOLE 1 (LSH X -2) 7), and (DPB 0 #o0304 X) ==> (BOOLE 4 X #o170) ] From the LISPMachine manual, page 14, "LEXPR-FUNCALL is like a cross between APPLY and FUNCALL. (LEXPR-FUNCALL ... ) applies the function to the arguments through followed by the elements of ." 2) Many new autoloadable functions and macros: Macros from LISP:MLMAC -- HERALD SELECTQ IF DEFVAR PSETQ SETQ-IF-UNBOUND MSETQ-CALL MSETQ-RETURN WITHOUT-INTERRUPTS WITH-INTERRUPTS WITHOUT-TTY-INTERRUPTS Macros from LISP:MACAID -- DEFSIMPLEMAC DEFBOTHMACRO Functions from LISP:MACAID -- +INTERNAL-DUP-P +INTERNAL-PERMUTIBLE-P |constant-p/|| |carcdrp/|| |no-funp/|| |side-effectsp/|| SYMBOLCONC FLATTEN-SYMS The file MC:LSPSRC;MLMAC > contains some "MacLisp MACros" which are being standardized for compatibility with LISPM and NIL All of these have AUTOLOAD properties in the latest LISPs (version numbers 1997 and greater, except PSETQ, MSETQ-CALL, and MSETQ-RETURN aren't in 1997). They are generally quite simple, and the most detailed explanation of each one can be gained merely by inspecting the source file. HERALD is used to print a loading message, subject to (STATUS NOLDMSG), and to put a VERSION property on the name of the package being loaded. SELECTQ, DEFVAR, SETQ-IF-UNBOUND, and PSETQ ("parallel setq") are for compatibility with the LISPMachine; MSETQ-CALL, and MSETQ-RETURN are essentially the same as the LISPM's MULTIPLE-VALUE and MULTIPLE-VALUE-RETURN but are limited to 8 args). (IF

... ) is like (COND (

) ('T ... )) The "WITH...INTERRUPTS" series bind NOINTERRUPT to T, (), and TTY respectively, and currently achieve their effect by a kludge which is likely to be unworkable on TOPS-10 systems [an internal "write only" variable, +INTERNAL-WITHOUT-INTERRUPTS, is used to get a memory trap upon binding or unbinding]. Someday this kludgy hack may yield to a potentially slower, but more robust, implementation. The file MC:NILCOM;MACAID > contains some macros and functions which are of aid in writing lisp MACROS. All of these have AUTOLOAD properties in the latest LISPs (version numbers 1997 and greater). DEFSIMPLEMAC -- this is like DEFMACRO restricted to one "argument"; if need be, a LAMBDA is "wrapped" around the macro product to prevent duplication of code. E.g., let SQUARE be defined as (DEFSIMPLEMAC SQUARE (X) `(TIMES ,X ,X)) then (SQUARE (CAR X)) ==> (TIMES (CAR X) (CAR X)), but (SQUARE (HUNOZ X)) ==> ((LAMBDA (G0031) (TIMES G0031 G0031)) (HUNOZ X)) DEFBOTHMACRO -- used just like DEFMACRO, except that a SUBR definition is also produced by macroexpanding a prototypical call, and the macro definition is conditionalized upon loading into a COMPLR. E.g., (DEFBOTHMACRO MAKE-FROBL (X Y Z) `(LIST ,X (LIST ,Y ,Z))) produces the equivalent DEFMACRO defintion which is loaded only when (STATUS FEATURE COMPLR) is true, and also produces a DEFUN like (DEFUN MAKE-FROBL (X Y Z) (LIST X (LIST Y Z))). [Note: Both DEFSIMPLEMAC and DEFBOTHMACRO are limited approximations to what will someday be called "DEFOPEN" -- a complete solution to the DEFSUBST attempt of the LISPM. KMP and I (JONL) have some ideas about doing this, but currently do not have the time to finish it; when completed, this feature will also make available to the user certain very general code-analysis and code-expander modules.] DEFCOMPLRMAC -- used to make the COMPLR part of a DEFBOTHMACRO. Syntax is just like DEFMACRO, and a conditional test for (STATUS FEATURE COMPLR) is "wrapped" around the defmacro. SYMBOLCONC (x1 ... xn) Basically, a form of STRING-APPEND, but result is returned as an INTERNed symbol. FLATTEN-SYMS (x l) Appends a list of all symbols on "x" to the list "l". |constant-p/|| (x) Non-() only if x is a "constant" with respect to EVAL. |carcdrp/|| (x) Non-() iff x is a symbol for a "carcdr" function (like "CADAR"). |no-funp/|| (x) Non-() iff x is a form consisting only of variables, constants, and primitive data access operations (like "CDDAR" and "+" etc). |side-effectsp/|| (x) Non-() iff x is a form whose EVALuation has no ordinary lisp side-effects (like SETQ, RPLACA, or calling unknown functions) +INTERNAL-DUP-P (x) Non-() iff (1) the arg is a piece of lisp code representing a fairly trivial computation, (2) it may be eval'd multiple times without side-effects, and (3) it is "cheaper" to duplicate the permissibly duplicatable code rather than do a lambda-binding. +INTERNAL-PERMUTIBLE-P (l) Non-() iff the forms on the list 'l' may be EVAL'd in any order, and get the same results/effects. For example (5 (MUMBLE X)) is permutible, since nothing which happens inside MUMLBE can affect the value of 5; but (X (RPLACA Y)) is not permutible, since X may point to a list which is updated by the RPLACA. 3) A user-extensible data-type scheme, using NIL's EXTEND data type, and with a hierarchical CLASS system. See also the documentation file ".INFO.;LISP EXTEND" on ITS systems and "LISP:EXTEND.DOC" on TOPS-10/20 systems. (The "USRHUNK" facility is required, and is take over by this CLASS system -- see 5 below). The autoloadable parts are: Functions from LISP:EXTEND -- PTR-TYPEP EQ-FOR-EQUAL? SI:DEFCLASS*-1 ADD-METHOD FIND-METHOD WHICH-OPERATIONS DESCRIBE Functions (with compile-time macro definitions) from LISP:EXTBAS ("basic") EXTENDP SI:MAKE-EXTEND SI:XREF SI:XSET SI:EXTEND-LENGTH SI:EXTEND (no macro definition) Macros from LISP:EXTMAC -- DEFCLASS* DEFMETHOD* MAKE-A-METHOD TYPECASEQ plus all accessor macros for CLASS objects Functions from LISP:SUBSEQ -- SUBSEQ REPLACE TO-LIST TO-VECTOR TO-STRING TO-BITS Functions and macros from LISP:EXTSTR ("structures") SI:DEFCLASS*-2 **SELF-EVAL** **CLASS-SELF-EVAL** A CLASS system, and all the new NIL data types, have been embedded into MacLISP, primarily using certain hooks into MacLISP's hunks. See the documentation file LISP:EXTEND.DOC (or .INFO.;LISP EXTEND on ITS systems, or also LISP;EXTEND DOC). In general, see the file NIL;NEWFUN > on the MIT-MC machine for a description of "new" functions added to NIL (acronymic for "NewImplementationofLisp", or if you like "NilIsLisp"). All of the LISPM string functions mentioned on pages 79.-83. of the manual are implemented, except NSUBSTRING. Also, many more functions are available, including those supporting a new primitive data type called CHARACTER, and for which the user is directed to the first page of the source file LISP:STRING.LSP (or on ITS systems, NILCOM;STRING >). For VECTOR's, whose support is in the file LISP:VECTOR, the functions available are VECTORP, VECTOR-LENGTH, SET-VECTOR-LENGTH (downwards only), VREF, VSET, MAKE-VECTOR and VECTOR. (MAKE-VECTOR ) makes vector full of nulls of size ; (VECTOR e0 e1 ... en) makes a vector of size n+1, with components e0 e1 ... en, and (VREF i) on such a vector would get the i'th zero-origined component; (VSET i ) would set it to the value . For BITS's (bit strings, or sequences of 0's and 1's), the functions, completely analogous with VECTORs, are BITSP, BITS-LENGTH, SET-BITS-LENGTH (downwards only), BIT, RPLACBIT, and MAKE-BITS. In addition, there are NIBBLE and SET-NIBBLE: (NIBBLE ) gets bits out of the bitstring , beginning at index , and makes them into a FIXNUM with bit being numerically the least significant. From the file LISP:SUBSEQ are several generic functions; (SUBSEQ ) constructs a new sequence of the same type as , beginning with element for a total new length of ; the second are third arguments are optional, with reasonable defaults. Thus, for example, (SUBSEQ "abcdefg" 2) would give out "cdefg". The functions TO-xxx are like SUBSEQ, except that they force the type of sequence output to be "xxx"; e.g. (TO-BITS '(1 0 1 1 0 0 1)) gives out #B"1011001", and (TO-VECTOR "AbC") gives #(~A ~/b ~C). REPLACE is for destructively clobbering a subpart of one sequence with that of another: (REPLACE ) starts at index of the sequence and replaces it with elements of the sequence beginning from , for a total of elements; the third, fourth, and fifth arguments are optional, with reasonable defaults. 4) Non-autoloadable Macros and Functions of general utility, from LISP:UMLMAC FIXNUMP FLONUMP LISTP EVENP LOGAND LOGIOR LOGXOR LOGNOT BIT-TEST BIT-SET BIT-CLEAR WHEN UNLESS DOLIST DOTIMES <= >= The definitions for most of these macros should be obvious, but a few need some more explanation: FIXNUMP is *not* the same as FIXP (which admits bignums); both FIXNUMP and FLONUMP merely check the TYPEP of their arg. LISTP admits the nullist as well as cons cells. EVENP is just not ODDP; "<=" is just "not >", but calls with 2 or 3 arguments are permitted. LOGxxx are the bitwise boolean operators defined on FIXNUMs, and may be given arbitrarily many arguments (except LOGNOT) BIT-xxx takes exactly two arguments; BIT-TEST is "true" if and only if the LOGAND is non-zero; BIT-SET is just LOGIOR; and BIT-CLEAR is non-commutative for (BIT-CLEAR ) acts like (LOGAND (LOGNOT ) ). (WHEN p e1 e2 ... en) is like (COND (p e1 e2 ... en)) (UNLESS p e1 e2 ... en) is like (COND ((NOT p) e1 e2 ... en)) (DOTIMES (i n) ......) expands into a DO loop which "does" the body n times, with "i" set to the loop counter each time (DOLIST (x y) ......) is much like (PROGN (MAPC '(LAMBDA (x) ......) y) ()) (DOLIST (x y i) ......) is similar, but "i" is set to a counter which is incremented each time down the list "y". Thursday FEB 07,1980 FM+6D.18H.36M.35S. LISP 1922 - JONL - 1) MACRO-EXPANSION-USE is a user-extensible feature - you may supply a function to do the macro "memoizing" or "displaceing". 2) FBOUNDP and SELECTQ defined as macros in MACAID, have autoload properties. 3) (STATUS FASLNAMELIST) gets the namelist of the file being FASLOAD'd or returns null if not in FASLOAD. 4) LOAD-BYTE (and DEPOSIT-BYTE) had their sense reversed - bit numbering is now low-order to high ("right-to-left") as in VAX-like computers. LDB and DPB remain the same. ____________________________________________________________________________ 1) MACRO-EXPANSION-USE is a user-extensible feature - you may supply a function to do the macro "memoizing" or "displaceing". The run-time global-variable MACRO-EXPANSION-USE, if not null, holds a "memoizing hook" function for macroexpansions (that is, for those defined by DEFMACRO with the DEFMACRO-DISPLACE-CALL option). This function takes two arguments, the original form and the expansion, and handles any displaceing, memoizing or whatever. The available built-in options are: () - No memoizing or displaceing, but just use the expansion. MACROEXPANDED - A system-supplied memoized-displace feature, which pays attention to changes of MACRO-EXPANSION-USE, and to any redefinition of the macro. MACROMEMO - A system-supplied hash-array scheme, for memoizing without displace the original form, but which does "pay attention" as above. (data on the hash-array are in MACROMEMO). Or, you may use any appropriate two-argument function, such as DISPLACE - Replace CAR and CDR of first arg with those from second. Previous usages of DEFMACRO and MACRO-EXPANSION-USE are fully compatible. Note: macros defined by MACRO or DEFUN, rather than by DEFMACRO will not interface to the generalized memoizing feature. Additionally, one should take care not to clobber the three system functions mentioned above, since other parts of the system depend upon them. 2) FBOUNDP and SELECTQ defined as macros in MACAID, have autoload properties. (FBOUNDP x) ==> (GETL x '(SUBR FSUBR LSUBR EXPR FEXPR MACRO)) SELECTQ just turns into CASEQ, but if the last clause was an "OTHERWISE", then it becomes "T" (so that CASEQ will stop on it) Sunday December 9,1979 FM+5D.18H.52M.12S. LISP 1914/COMPLR 904 - JONL, RWK - WARNING! The two new macro-characters, items 1 and 2 below, may become standard someday (set up as macros in the initial lisp environment); anyone who will have trouble accommodating should send mail to BUG-LISP. 1) +INTERNAL-#-MACRO is autoloadable, for use as a reader-macro-character function for "#"; fully compatible with NIL/LISPM usage. 2) +INTERNAL-/"-MACRO is defined for use in making " a string macro character. TTYSCAN-STRINGERS| helps TTY-rubout processing in string-like sequences. 3) Two **INCOMPATIBILITIES**: Carriage-Return, no longer invisible, is now a "white-space" character. TERPRI is initially non-null, meaning no automatic insertion of 's. 4) PROG1 -- Like PROG2 but return first argument instead of second. 5) SETF is an FSUBR like the LISPM's general update operator DEFSETF is an autoloadable macro to help one extend the SETF range. 6) As on LISPM, PUSH and POP have been extended to use SETF instead of SETQ. 7) INCLUDEF is a subr version of INCLUDE, for the sake of transportable code. 8) A new "Software device" convention for NAMELIST-series functions. Namelists of the form ((LISP) * *) refer to the maclisp system area. 9) LDB and DPB and other new AUTOLOADable software as fasl file on LISP: files ((LISP) DEFVST FASL), ((LISP) MACAID FASL), ((LISP) LODBYT FASL) 10) VSAID - VECTOR support package; STRING - support and NILAID on LISP: 11) (STATUS FILESYSTEM-TYPE), (STATUS OPSYSTEM-TYPE), and (STATUS SITE) Warning! (LAST (STATUS FEATURES)) for non-ITS systems will be different. 12) Some things that failed to be documented previously about DEFUN/DEFUN& &WHOLE - DEFMACRO now permits a keyword &WHOLE, to get at whole call form DEFUN reverts to DEFUN& "if necessary"; e.g. for keywords and destructuring 13) FRETRY, a new function which is in many ways like FRETURN. 14) The setting of "+" in the toplevel and break loops modified. 15) SPRIN1, a Pretty-printing version of PRIN1 autoloadable from GRINDEF 16) CLEAR-INPUT and CLEAR-OUTPUT on SFA's now works 17) USERATOMS-HOOKS, for compiling user-defined "SQUIDified" datatypes 18) EOF-COMPILE-QUEUE, for queueing forms to be "done" at the end of file. ____________________________________________________________________________ ** NOTE ** In the commentary which follows, this marker marks sections ** NOTE ** explaining features not yet present on the LISP machine. ** NOTE ** At some point in the future it is expected they will be added, ** NOTE ** but in the interim, people writing code for both systems should ** NOTE ** be careful. 1) +INTERNAL-#-MACRO is autoloadable, for use as a reader-macro-character function for "#"; fully compatible with NIL/LISPM usage. +INTERNAL-#-MACRO is provided with an autoload property such that if the user does (SETSYNTAX '/# 'SPLICING '|+INTERNAL-#-MACRO|) he will get a MACLISP/LISPM/NIL compatible version of the read macro character for #. Lately, this "generalized" macro character has been especially useful for conditionalizing out lines of code based on which dialect of lisp the code is being read into. Needless to say, it would be nice if users could begin to accommodate this macro-character definition, so that it can turned initailly on some day - it currently is set on by LISPM and NIL. The read-time meaning of a "#" instance is determined by a "dispatch" character, which immediately follows the "#" (except when there is a numeric "argument", in which case the base-10. digits occur between the "#" and the dispatch character, or if there is a "control,meta" argument in which case the argument is between the "#" and the dispatch). The dispatch character is completely programmable (by the user too) in essentially the same way that macro characters in general are programmable. The function SETSYNTAX-SHARP-MACRO is like SETSYNTAX, but is for the meanings of the character following a #. However, the associated function must take one argument, which will be bound to any "argument" as indicated above - null for no argument, a fixnum if the argument is a digit string, and a symbol if the argument is one of ^B ("CONTROL"), ^C ("META"), or ^F ("CONTROL-META"). DEFSHARP, an autoloadable macro, provides an easy way to set up "macro character functions", to which the general # macro character function will dispatch, depending on the character immediately following the #. (DEFSHARP /% (() ) (MACROEXPAND (/#SUB-READ () READ-STREAM))) defines (and activates using SETSYNTAX-SHARP-MACRO) a function to be run when #% occurs. There are several more options, for which the interested party is referred to the commentary in the source code near the definition of DEFSHARP. Currently, the following characters are set up as "SHARP-MACRO"s: / - Input the following character, and give out its ascii value - thus #/A yields 65. (101 octal). A "cntrl,meta" argument will add in amount to make a 9-bit ascii code, with "cntrol" adding 2^7, and "meta" adding 2^8; thus #/A yields 449. (701 octal). ^ - Input the following character, and XOR 2^6 into its ascii value - this generally has an effect similar to holding the control key down while typing that character. Any argument is ignored. . - Read-time ealuation of the next form. Any argument is ignored. Thus, (A #.(1+ BPORG) B) might read in like (A 125755 B). , - Load time evaluation of the next form. "#," is the same is "#." except when compiling, in which case a "SQUID" is returned. Any argument is ignored. % - Read-time macro expansion; thus #%(FOO 3) will be read in like #.(MACROEXPAND '(FOO 3)) ' - #' reads in like (FUNCTION ). Any argument is ignored. * - Numeric read in the "natural base" or your machine - thus for the PDP10 and LISPM, #*xxxx* will read the digits "xxxx" in octal; likely some other machines will use hexadecimal. Any argument is ignored. [This is intended for use by machine dependent code.] \ - Following this is an alphabetic name of a character, and its ascii value is returned; as with "#/", a "cntrl,meta" argument will potentially convert to a 9-bit code. The correspondence between names and values is as follows: NULL - 0, BS - 8, BACKSPACE - 8., TAB - 9, LF - 10., LINEFEED - 10., VT - 11., FF - 12., FORMFEED - 12., CR - 13., RETURN - 13., NL - 13., NEWLINE - 13., ALTMODE - 27., SP - 32., SPACE - 32., RUBOUT - 127., DELETE - 127., ALPHA - 2, BETA - 3, EPSILON - 6, HELP - 2110. BELL - 7., FORM - 12., BACK-NEXT - 31. + - Next form should be a feature name, or boolean combination of feature names, and the form after that will be read in and flushed unless the specified featues are on the (STATUS FEATURES) list. E.g. (A #+SAIL B C) Will be "(A B C)" on the SAIL system but "(A C)" elsewhere. (A #+(and (or VSAID STRINGS) (not EXPERIMENTAL)) B C) As above, but the "B" is present only for non-experimental systems which have either a VSAID or STRINGS feature. - - Just like "+" above, but with the sense reversed. Thus #-{...} is equivalent to #+(not {...}) M - Equivalent to #+MACLISP N - Equivalent to #+NIL, except that additional NIL syntax is permitted in the forms to be passed over. For example, #B"10110" and #T and #(...) would normally be illegal for maclisp, but within the scope of a #N they are readable (for the primary purpose of correct parsing, since they would normally be thrown away; but if the NILAID pacakge is present, supporting a sort of NIL-in-maclisp, then a cooperative answer is returned). O - Octal reading - a number should follow Q - Equivalent to #+LISPM R - Temporary radix change for reading a number; e.g. #3R2010 reads in base 3 and returns 57. The "base" must be a number between (not inclusive) 1 and 37., expressed as digits in base ten; thus #16R... would indicate a hexadecimal notation. Due to a shortcoming of maclisp, if you want to use digits greater than 9, as in #16R-1A9 (= -425.), you must preceed the number with an algebraic sign. X - Hexadecimal reading - a number should follow On the ITS systems, the source code (or a link to it) will be in the file LIBDOC;SHARPM NIL 2) +INTERNAL-/"-MACRO is defined for use in making " a string macro character. TTYSCAN-STRINGERS| helps TTY-rubout processing in string-like sequences. The function defined for +INTERNAL-/"-MACRO returns an uninterned symbol which has been set to itself; as with "#", it is up to the user to do (SETSYNTAX '/" 'MACRO '+INTERNAL-/"-MACRO) if he wants. TTYSCAN-STRINGERS| is a variable set up to an a-list of start and stop (ascii values of) characters so that the system-supplied tty prescan function can know about which (read macro) characters are string-like delimiters. Of course, you may supply your own macro function for doublequote if you don't like the style of +INTERNAL-/"-MACRO. The compiler version of this function - +INTERNAL-/"-MACRO - in addition to the abovementioned action, puts a "+INTERNAL-STRING-MARKER" property on the symbol as well, so that it may output `(PROGN (SETQ ,symbol ',symbol) (PUTPROP ,symbol T '+INTERNAL-STRING-MARKER)) This allows a macro to use a string compiled into it in producing code which gets output to yet another FASL file, and have that final one still have the same characteristics of the original. Code which produces symbols for strings can put this property on when in the compiler, to cause this processing to happen for his strings as well. This saves the user from having to write his own USERATOMS-HOOK (see below). 3) Two **INCOMPATIBILITIES**: Carriage-Return, no longer invisible, is now a "white-space" character. TERPRI is initially non-null, meaning no automatic insertion of 's. This means that will terminate an atom, just like space does, and also that it is not necessary to "slashify" 's occurring within a vertical-bar or double-quote string. Actually, many persons may prefer to reset TERPRI to (), so that symbols will not appear to "wrap-around" at the end of a line; the only danger is that atoms (symbols or bignums) which are longer than the line-length will have a carriage-return inserted "in the middle" of them, thereby destroying read-back capability. 4) PROG1 -- Like PROG2 but return first argument instead of second. (PROG1 e1 e2 ... en) is like (PROG2 () e1 e2 ... en) So if you had this defined as macro in your files, you can relax now. 5) SETF is an FSUBR like the LISPM's general update operator. DEFSETF is an autoloadable macro to help one extend the SETF range. SETF is particularly useful with structure accessing macros, such as DEFVST (or other packages) would define. It's syntax is like a generalized SETQ. For example, assume there is a macro defined by (DEFMACRO SHIP-LABEL (X) `(CXR 6 ,x)) then (SETF (CADDAR A) 'BAR (CDR B) (LIST 4) Y 'BUZZ (SHIP-LABEL MYSHIP) 'JOLLY-ROGER) is equivalent to (PROGN (RPLACA (CDDAR A) 'BAR) (RPLACD B (LIST 4)) (SETQ Y 'BUZZ) (RPLACX 6 MYSHIP 'JOLLY-ROGER)) Five standard cases are "built-in" in the interpreter, but are redefinable with the generalized SETF expander package which will be autoloaded when used. a) symbols, in which case SETF acts just like SETQ; b) car/cdr operations up to depth 4, inversion is either a RPLACA or RPLACD; e.g. (SETF (CADR X) Y) operates like (RPLACA (CDR X) Y); c) GET, is inverted by PUTPROP; e.g. (SETF (GET (MUMBLE) BAR) 'LO) works like (PUTPROP (MUMBLE) 'LO BAR) , however, correct order of evaluation is obeyed, namely strict left-to-right from the original form; [as of 12/10/79, the order-of-evaluation specification has a bug in it, but this may be corrected - JONL ] d) PLIST, inverted by SETPLIST, and e) ARRAYCALL inverted by STORE; Macros are expanded 1 step at a time, and a SETF-X property is checked for, in case the user has an overriding expander. If the access is not a SETF-X expansion, or one of the 5 recognized cases, (or a macro or "autoload" which expands into such), then the function +INTERNAL-SETF-X is called on the list of remaining access/value pairs and the result is EVAL'd. The return value is the result of the last form; *note* that the last form is not evaluated twice unless it is safe and cheap to do so. ** NOTE ** On the LISP Machine, only one access/value pair is allowed ** NOTE ** and the return value is not defined. This is a superset of ** NOTE ** the LISP Machine definition. If you wish your code to run ** NOTE ** on the LISP Machine, you will have to limit your usage to ** NOTE ** these constraints, and the similar constrains it places on ** NOTE ** PUSH and POP. In compiled code, no extra overhead is associated with the return value being defined, unless you actually make use of it; the form is analyzed (possibly) differently depending on whether the resultant value is needed. DEFSETF, an autoloadable macro, allows telling SETF, PUSH, and POP how to invert an access; for simple cases, DEFSETF makes accessor inversion definition very easy. (DEFSETF (( () ) ) ) where is the name of the function to invert, is a series of symbols to be bound to arguments to the function to be inverted. is the symbol to be bound to the value to be stored. is T or (), according to whether the return value from the inverted form is the same as . is a form to CONS up the apropriate code to store into the slot specified. For example, the DEFSETF for CXR: (DEFSETF CXR (( () INDEX HUNK) VALUE) () ;RPLACX returns HUNK, not VALUE `(RPLACX ,INDEX ,HUNK ,VALUE)) Handling LSUBRs and FSUBRs and macros with variable numbers of arguments is not quite as simple. Those interested should see MC:NILCOM;SETF > It is also possible to write other macros which make use of this information in such a way to avoid duplicating forms in the macro in the code, etc. A mechanism to make this easy to use will be provided. 6) As on LISPM, PUSH and POP have been extended to use SETF instead of SETQ. Thus (PUSH 'BAR (CAR (FOO))) is like (SETF (CAR (FOO)) (CONS 'BAR (CAR (FOO))) ** EXCEPT: ** ** NOTE ** Unlike on the LISP Machine, the return value of PUSH is ** NOTE ** defined to be the new value of the list ("stack"). Also, ** NOTE ** there will be no multiple evaluation of the function FOO, ** NOTE ** as would occur on the LISP machine, and the order of evaluation ** NOTE ** is guarenteed to be left-to-right Also, you can do (POP (SAVED-LOCS (GET-FROB)) (CURRENT-LOC (GET-NEW-FROB))) where SAVED-LOCS and CURRENT-LOC are suitable accessor macros to a stack of "LOC"s in a "FROB" and a single "LOC" in a "FROB", respectively. The second argument is optional, and in all cases, the return value is the CAR of the list accessed ** NOTE ** The LISP Machine supports only the 1 argument case, and does ** NOTE ** NOT guarentee single-evaluation of the accessor nor left-right ** NOTE ** order. 7) INCLUDEF is a subr version of INCLUDE, for the sake of transportable code. (INCLUDEF '((NILSRC) DRAMMP >)) is like (INCLUDE ((NILSRC) DRAMMP >)) This allows conditional inclusion, such as according to site or filesystem. 8) A new "Software device" convention for NAMELIST-series functions. Namelists of the form ((LISP) * *) refer to the maclisp system area. I/O functions which accept namelists will look for a PPN property on a symbol before deciding that it is not a device; if found, then that property is substituted for the device-directory field, and the "namelist" tries again. In particular, the symbol LISP, on non-ITS systems, will have an initial PPN property (if in fact there is no "LISP" device), which will link to the directory with the autoload files on it. On the ITS systems, "LISP" has a PPN property of NIL, but the NAMELIST functions have always converted an unknown device name into a directory name. 9) LDB and DPB and other new AUTOLOADable software as fasl file on LISP: files ((LISP) DEFVST FASL), ((LISP) MACAID FASL), ((LISP) LODBYT FASL) DEFVST - a structure-defining package for MACLISP/LISPM/NIL documentation is on LISP;DEFVST DOC MACAID - many "aids" to macro usage. "(HERALD /30)" produces a form which will print out the version number of the when it is being loaded - a number obtained from the second file name of the source when it is being compiled. The reader is referred to commentary in the source file of MACAID for further information. LODBYT - LDB and DPB are LISPM-compatible macros (which in some cases will call the small subroutines *LDB and *DPB). "LOAD-BYTE", a macro with args ( ) assumes that "" is a 36-bit word, "" is the low-order bit of a byte of length "" bits (0-origin indexing). Bits are numbered from low-order high-order ("right-to-left") with the lowest-order bit being 0. "(DEPOSIT-BYTE )" is similar, but the is inserted into the return copy of the . Although LDB and DPB are documented in the LISP Machine Manual, there is a definition here below for benefit of those who couldn't get a LISPM manual. For LDB and DPB - The representation "" assumes that in base 8, this argument is expressing two octal digits "pp" followed by another two octal digits "ss". Then "(LDB )" selects a byte of (\ 64.) bits in length, which is positioned in with (\ (// 64.) 64.) bits to the right of the byte; in other words, is a PDP10 byte-pointer right-shifted by 24. bits. For "(DPB )", note that DPB is a non-destructive operation which returns a new value. Some cases of the macro-expansions of LDB and DPB (and LOAD-BYTE and DEPOSITE-BYTE) produce LSH and BOOLE, but others produce calls to the functions *LDB and *DPB; thus, until the compiler begins to open-code *LDB and *DPB, you will need this "macros" file loaded into your run-time environment also. 10) VSAID - VECTOR support package; STRING - support, and NILAID on LISP: NILAID is a NIL-compatibility support package for maclisp. VSAID is a limited support package for using VECTORs and EXTENDs, which is required by DEFVST, STRING and NILAID. STRING has the NIL and LISPM string handling primitives in it, with a few basic ones coded "by hand" for speed. Garbage-collection strategy requires the use of the GC-DAEMON. See the first page of the source file for more information. 11) (STATUS FILESYSTEM-TYPE), (STATUS OPSYSTEM-TYPE), and (STATUS SITE) Warning! (LAST (STATUS FEATURES)) for non-ITS systems will be different. The last item in the "features" list will be (STATUS FILESYSTEM-TYPE) and the next-to-last will be (STATUS SITE); this will mean no change for ITS-supported systems, but will be different on the other kinds of systems. The FILESYSTEM-TYPE is either "ITS", "DEC20", or "DEC10" and is a kind of general "operating-system type". The OPSYSTEM-TYPE is either "TOPS-20" or "TENEX", when the file-system type is DEC20; or, if the file-system type is DEC10, it is among "TOPS-10" (for vanilla-flavoured TOPS-10), "CMU" (for CMU-hacked-up TOPS-10), or "SAIL" (for a SAIL-perverted-WAITS TOPS-10. The SITE name was originally meant to distinguish running on the MIT-AI machine from the MIT-ML machine (but nowadays, the same maclisp system runs unmodified on all ITS machines); nevertheless, the SITE name is among "AI", "ML", "MC", or "DM" for ITS systems, "TOPS-20" or "TENEX" for DEC20 style systems, "SAIL" for (r.i.p) the SU-AI system, and "TOPS-10" or "CMU" for non-SAIL DEC10 style systems. Someday, the DEC10/DEC20 site names may be more informative, e.g. "CMU-10A", "XX", "BBN-D" or whatever. 12) Some things that failed to be documented previously about DEFUN/DEFUN& &WHOLE - DEFMACRO now permits a keyword &WHOLE, to get at whole call form by specifying a variable to be bound to the whole call form. (DEFMACRO FOOM (&WHOLE X) ) would bind X just like (MACRO FOOM (X) ) DEFUN reverts to DEFUN& "if necessary"; e.g. for keywords and destructuring Thus in MACLISP, you can use the & keywords, and argument destructuring without expliciting using DEFUN&. For example, (DEFUN FOO ((A . B) &REST W) (LIST A B W)) becomes essentially (DEFUN FOO G0005 (LET ((W (AND (> G0005 1) (LISTIFY (- 1 G0005)))) ((A . B) (ARG 1))) (LIST A B W))) Any required, optional, or rest variable may be null, meaning "ignore". DEFUN& with "&optional" and/or "&rest" keywords (and DEFUNs that are turned into DEFUN& with these keywords) cause the function to become an LEXPR type - (compiled into LSUBR instead of SUBR). Thus, in order to compile other functions calling these functions, you will likely have to give *LEXPR declarations for these functions, even though they are not explicitly of the maclisp LEXPR format. ** DEFUN&-CHECK-ARGS controls whether or not there is run-time checking to see if a DEFUN& with &OPTIONAL or &REST arguments has too many or two few arguments passed. 13) FRETRY, a new function which is in many ways like FRETURN. FRETRY "unwinds" the stack to the point indicated by the first argument, which should be a PDL pointer such as would be in the list returned by EVALFRAME, and it then evaluates the form extracted from its second argument, which should be a list such as would be returned by EVALFRAME. It was intended primarily to be used to "re-try" something that appears to be losing, but which has been corrected (say, in an error break loop). E.g. (SETQ EF (EVALFRAME ...)) (FRETRY (CADR EF) EF) But it could be used more generally, e.g. (SETQ PP (GET-PDL-PTR )) (FRETRY PP `(EVAL ,pp (BREAK STOP-AND-LOOK))) In fact, one could define (DEFUN FRETURN (PP X) (SETQ PP (EVALFRAME (1+ PP))) (FRETRY (CADR PP) (CASEQ (CAR PP) (EVAL `(EVAL ,(cadr pp) (QUOTE ,x))) (APPLY `(APPLY ,(cadr pp) (QUOTE (,x))))))) 14) The setting of "+" in the toplevel and break loops modified. If "+" is input to the toplevel or break loops, then the value of "+" will not be set for that time around, thus leaving "+" with a value corresping to the previous input to toplevel or break. 15) SPRIN1, a Pretty-printing version of PRIN1 autoloadable from GRINDEF SPRIN1 is an autoloadable function suitable for assigning to PRIN1, so that the general top-level printer becomes a "SPRINTER". Try, for example, (SETQ PRIN1 'SPRIN1) 16) CLEAR-INPUT and CLEAR-OUTPUT on SFA's now works Hurray! They give it the CLEAR-INPUT and CLEAR-OUTPUT operation, if defined. The argument is always (). 17) USERATOMS-HOOKS, for compiling user-defined "SQUIDified" datatypes This hook provides a means for the user to manipulate user-defined "atomic" datatypes in the compiler, and then substitute a SQUIDform-like piece of code to construct such an object when the form is output to the FASL file. For example, if the user has macros which manipulate strings represented as (STRING-MARKER . ), he would be unable to include any of these strings as literal data in the FASL file, since there is no representation for arrays in FASL files. However, with this hook it would be possible to achieve the effects of outputing these strings directly. The alternative until now has been to use "SQUID" forms, but this has the disadvantage that you cannot then manipualate these things in the same manner as in the interpreter. If the symbol USERATOMS-HOOKS is non-nil, it should be a list of functions of one argument, which will be called on every piece (atomic or not) of any literal object being output to the FASL file. If the object does not need special handling, the function should return (). Otherwise it should return the NCONS of an s-expression to evaluate at load time to create the object. The hook will not be called on an object more than once. EQness is preserved, if two strings or whatever are EQ in the compiler, they will be made EQ in the interpreter (using the atom-table, for you low-level hackers). (eval-when (COMPILE) (defun MYSTRINGHOOK (form) (cond ((atom form) ()) ;If we don't recognize it, return () ((eq (car form) 'STRING-MARKER) ;One of ourse `((CONS 'STRING-MARKER (fillarray (array () ,(arraysize (cdr form))) ',(listarray (cdr form)))))) (t ()))) ;Not one of ours, return (). (push 'MYSTRINGHOOK USERATOMS-HOOKS)) This is not implemented as efficiently as it might be. If it is too slow, it can be speeded up. [Note: the resulting FASL file may not work in LISP 1861 or before, due to a but in FASLOAD] 18) EOF-COMPILE-QUEUE, for queueing forms to be "done" at the end of file. EOF-COMPILE-QUEUE provides a means to "add forms to the end of the file" in the compiler. Thus if you need certain cleanup actions performed at the end of the file, you can push forms onto this queue, which will be compiled in the order they were pushed when the end of the file is reached. It is OK for forms on this queue to push new forms onto the queue. Thursday August 16,1979 LQ+1D.1H.28M.3S. LISP 1860 / COMPLR 895 -JONL- 1) DEFMACRO usages no longer cause automatic loading of DEFMAX file. 2) DEFUN& and DEFMACRO admits a "supplied-p" variable for &OPTIONAL variables. 3) DEFAULTF no longer manipulated by LOAD or FASLOAD, and new initial value. 4) ERROR-BREAK-ENVIRONMENT - sets OBARRAY/READTABLE for ^B and error loops. 5) Splicing macros which return a singleton list may now appear at top level.î The following three items apply to compiler usage: 6) New COMPLR switch "~", controlling the variable QUIT-ON-ERROR 7) New UUO "STRT7" for typing out ascii strings. Works similar to "STRT". 8) Two numerical No-Op subrs FIXNUM-IDENTITY and FLONUM-IDENTITY open-compile ____________________________________________________________________________ 1) DEFMACRO usages no longer cause automatic loading of DEFMAX file. As of version 80, DEFMACRO will stop outputting, along with each macro definition compiled, the form (AND (NOT (GET '|forget-macromemos/|| 'SUBR)) (LOAD `(,(car (get 'defmacro 'autoload)) DEFMAX FASL))) Since LISPs prior to about version 1832 did not have autoload properties for the auxillary functions needed by DEFMACRO-defined macros, then each such macro explicitly tried to load the DEFMAX file if not already loaded. If you see a message about "|forget-macromemos/|| Undefined Function" it is probably because you are using DEFMACRO output in an old LISP (and some of the system code does depend upon DEFMACRO, e.g. LET) so you should simply load the DEFMAX file by hand. 2) DEFUN& and DEFMACRO admits a "supplied-p" variable for &OPTIONAL variables. The format "(binding default-value flag-variable)" used in a place where a &OPTIONAL variable would be used, causes the symbol "flag-variable" to be bound to T if that optional argument is actually supplied, and to null otherwise. Example: (DEFUN FOO (&OPTIONAL (Z () ZP?)) ... ) causes "ZP?" to be non-null for those calls to FOO with an argument. 3) DEFAULTF no longer manipulated by LOAD or FASLOAD, and new initial value. This has the consequence that only the "oldio" compatibility functions change DEFAULTF (namely, UREAD, UWRITE, UFILE, UKILL). Furthermore, its initial setting will be `((DSK ,(status udir)) * >) ;ITS `((DSK ,(status udir)) * LSP) ;TOPS-10/CMU `((PS ,(status udir)) * LSP) ;TOPS-20/TENEX `((DSK ,(status udir)) * ___) ;SAIL (kludge, meaning no extension) 4) ERROR-BREAK-ENVIRONMENT - sets OBARRAY/READTABLE for ^B and error loops. As a special variable, ERROR-BREAK-ENVIRONMENT holds a pair (cons pair) of an obarray and readtable to use during the system-supplied ^B break and error handlers. Its initial setting is `(,(get 'OBARRAY 'ARRAY) . ,(get 'READTABLE 'ARRAY)) This may be especially useful to the person who is debugging his macros during the compilation of some file, and wants a different debugging environment than the compiler's OBARRAY/READTABLE. 5) Splicing macros which return a singleton list may now appear at top level. also may appear just after a "dot" for a dotted pair or hunk. At top level, if a splicing macro returns a list of one element, then READ returns that element just as if it were read primitively; the same holds true for splicing macros just after a dotted-pair dot. E.g., if "~" is defined as (SETSYNTAX '/~ 'SPLICING '(LAMBDA () (READ))) then (A . ~(B)) reads in the same as (A . B) An error (ILLEGAL RETURN VALUE FROM SPLICING MACRO --READ) is given if something other than () or a singleton LIST is returned in this context. (Longer lists are of course legal in other circumstances). Multiple splicing macro calls can be placed after a dot, but only one of them can return non-NIL, or it is an error. 6) New COMPLR switch "~", controlling the variable QUIT-ON-ERROR Generally, if an *error* (as opposed to a warning condition) is discovered, the COMPLR will go into a BREAK loop, awaiting further intervention by the user. But if the value of the variable QUIT-ON-ERROR is non-null, it will merely do a (QUIT); The initial value of this variable is (). 7) New COMPLR switch "7", controlling the variable USE-STRT7 LISP 1858 has a new UUO, "STRT7", for typing out ascii strings, which works similarly to "STRT". The compiler will generally turn PRINC of a quoted thing into a STRT (which is for sixbit formats), but now "STRT7" can be used, resulting in shorter lengths for lower-case strings. Initially USE-STRT7 is off, since older LISPs don't support STRT7. 8) Two numerical No-Op subrs FIXNUM-IDENTITY and FLONUM-IDENTITY open-compile Along with the numerical subrs "+", "+$", etc. are added two identity functions: (FIXNUM-IDENTITY x) requires that x evaluate to something of type FIXNUM, and (FLONUM-IDENTITY x) similarly requires FLONUM; both merely return their argument. In the past, users have been checking the type of certain arguments by code like "(+ )" and "(+$ )"; these forms will still achieve the desired effect, but "FIXNUM-IDENTITY" and "FLONUM-IDENTITY" can be used to distinguish this case from accidental 1-argument uses of the fixnum PLUS function. These functions are not part of a type-assertion scheme, but merely take advantage of the compiler's open-coding schemes. Thursday June 07,1979 FQ+5D.11H.58M.56S. - Jonl - 1) Value of "MAKHUNK" permits use of a new HUNK2 space. 2) HUNKs now have a PRINT syntax, and can be FASLOADed 3) Added comma syntax for backquote selects NCONC rather than APPEND 4) Backquote macro permits "grindef"ing in format exactly as read in. 5) The famous but Kludgy Binford Editor is now autoloadable. 6) Remaining hooks into TOPLEVEL/BREAK loop 7) LAST-MACROEXPANDED-LOSER is gone. 8) RPLACX now is open-coded by COMPLR (in the same way that CXR is) 9) New compiler switch: HUNK2-TO-LIST, with switch letter "2". _______________________________________________________________________ 1) Value of "MAKHUNK" permits use of a new HUNK2 space. The value of the special variable MAKHUNK controls whether hunks of size 1 and 2 are stored in LIST space, or in a HUNK2 space. MAKHUNK = T says use HUNK2; initial setting is MAKHUNK = T. The compiler will rewrite forms like "(HUNK x)" and "(HUNK x y)" into appropiate calls to NCONS or CONS, depending on the value of the new compiler switch "HUNK2-TO-LIST" - see the comment below. 2) HUNKs now have a PRINT syntax, and can be FASLOADed When "MAKHUNK" is non-null, certain formats will be recognized by the reader as presenting HUNKs; when "MAKHUNK" is null, these formats will be treated as previously, namely erroneous. Any "S-expression" presented like a list, but with more than one dot, or with a dot immediately before the final parens, will be read-in as a HUNK. E.g. (A . B . C), (A . B .) as well as (A .) PRINT will always put the dot before the final parens. FASLAP can output hunks, in case any should be incorporated into your expr code; and FASLOAD can load them back in. 3) Added comma syntax for backquote selects NCONC rather than APPEND The form ",." in addition to ",@" is recognized by the backquote feature. ",." selects NCONC instead of APPEND, and thus we have `(,@B C) generates (APPEND B '(C)) `(,.B C) generates (NCONC B '(C)) [This idea, for ",." comes from RBR] 4) Backquote macro permits "grindef"ing in format exactly as read in. The "backquote" macro now has the option of generating "macroified" code, with the name |`-expander/|| as a primary eval-time macro. This option will be exercised if BACKQUOTE-EXPAND-WHEN is "EVAL" (or in general anything except "READ"), and otherwise the expansion will occur at read-in time just as at present. Three other internal markers are added: |`,/|| |`,@/|| and |`,./||. GRINDEF would print out a form just like it was read-in, using the READMACROINVERSE feature; however, there is a flaw in this feature in that readmacros won't appear in the CDR part of a list; thus you never see '(A . 'B) grindef'd out that way. For the same reason, it would be somewhat of a pain to get `(A . ,B) to grindef out that way, but `(A ,@B) and `(A ,.B) both win. Note the weird commutation: `(A . ,B) works the same as `(A ,. B) ?? All the aforesaid "markers" and macros are on the obarray, so that any PRINTing or GRINDEFing (regardless of the success of the READMACROINVERSE attempts) would be readable back in with no loss of functionality. All such markers (and other parts of this feature) are automatically autoloaded. 5) The famous but Kludgy Binford Editor is now autoloadable. Thus it is no longer part of the initial ITS maclisp environment. REMEMBER:  holds the last thing killed  holds the "back-upwards" list ^^^ holds the "back-leftwards" list EDIT hold a list of the names for "editible" properties "S", that is the search command, with no trailing arguments, means to search again for the same thing as before. Both "S" and "I" take arbitrarily many trailing arguments, terminated by Also, any symbol with an EDIT property may be an edit command, wherein the function stored under the EDIT property is applied to a number: 0 means no numeric arg to function n > 0 is the numeric argument given to the command 6) Remaining hooks into TOPLEVEL/BREAK loop The following special global variables are now in the system, and they also have respectively a SUBR property corresponding to the system-supplied code for the parallel top-level operations: READ-EVAL-*-PRINT for "prin1" part of the loop, subr of 1 arg READ-EVAL-PRINT-* for "terpri" part of the loop, subr of 0 args *-READ-EVAL-PRINT for "read" part of the loop, subr of 0 args READ-*-EVAL-PRINT for "eval" part of the loop, subr of 1 arg The "LISP RECENT" note of May 15,1978 mentioned two of these as "hooks" into the TOPLEVEL/BREAK loop; the number of these hooks is thus now extended to include the full set possible. Recall that each such function "intercepts" the TOPLEVEL/BREAK loop at the point of the "*" in its PNAME. Thus one pass through the loop would look essentially like: (AND *-READ-EVAL-PRINT (FUNCALL *-READ-EVAL-PRINT)) ;"intercept" (SETQ * (*-READ-EVAL-PRINT) ;TOP-LEVEL-READ (AND READ-*-EVAL-PRINT (FUNCALL READ-*-EVAL-PRINT *)) ;"intercept" (SETQ * (READ-*-EVAL-PRINT *)) ;TOP-LEVEL-EVAL (AND READ-EVAL-*-PRINT (FUNCALL READ-EVAL-*-PRINT *)) ;"intercept" (READ-EVAL-*-PRINT *) ;TOP-LEVEL-PRINT (AND READ-EVAL-PRINT-* (FUNCALL READ-EVAL-PRINT-*)) ;"intercept" (READ-EVAL-PRINT-*) ;TOP-LEVEL-TERPRI 7) LAST-MACROEXPANDED-LOSER is gone. It used to do something in macros defined by DEFMACRO. 8) RPLACX now is open-coded by COMPLR (in the same way that CXR is) 9) New compiler switch: HUNK2-TO-LIST, with switch letter "2". causes "(HUNK x)" to compile like "(NCONS x)", and "(HUNK x y)" to compile like "(CONS x y)". Initial setting is (), so that hunk calls are output; in the object environment, a hunk call may actually produce a list cell if MAKHUNK is null. Wednesday April 11,1979 FQ+7D.0H.20M.8S. - JONL - 1) New features for DEFMACRO: MACRO-EXPANSION-USE and temporary switch overrides for the free-variable type switches. 2) OWN-SYMBOL - a declaration for disassociating any systemic properties from a symbol when compiling a file. 3) MACRO-EXPAND in the compiler - a macro-expander for all levels. ____________________________________________________________________________ 1) New features for DEFMACRO: MACRO-EXPANSION-USE and temporary switch overrides for the free-variable type switches. MACRO-EXPANSION-USE for "memorizing" macro expansions in a hash-array and for displace'ing macros in which the call is displaced in an "back-up'able" manner. Temporary overrides for the three macro-definition switches (namely DEFMACRO-DISPLACE-CALL, DEFMACRO-FOR-COMPILING, and DEFMACRO-CHECK-ARGS). This feature is available for DEFMACRO and DEFUN/& and MACRO. 1a) Chuck Rich's macro annotation package (MACROD) and Ken Kahn's macro expansion package have been added to MACLISP's DEFMACRO facility. A new runtime switch (as opposed to macro definition time switch) has been added, MACRO-EXPANSION-USE: If MACRO-EXPANSION-USE is set to MACROMEMO, then Rich's hash- array "memoizer" will remember previously-expanded macro calls, and not re-expand unless the macro is redefined (via DEFMACRO); If MACRO-EXPANSION-USE is set to MACROEXPANDED, then Kahn's style "displacer" will displace the original call with a form which remembers both the old original, and the expansion, and not re-expand unless the macro is redefined (via DEFMACRO); GRINDEF is smart about these "displaced" forms. In the runtime environment, macros produced while DEFMACRO-DISPLACE-CALL is non-null will pay attention to the global variable MACRO-EXPANSION-USE (default = () ). MACRO-EXPANSION-USE: = MACROEXPANDED - Displace the original cell with a form like (MACROEXPANDED ) Thereafter, the macro named MACROEXPANDED will return the until either the value of MACRO-EXPANSION-USE changes, or the of the original macro changes (such as by loading in a new definition of the macro). = MACROEXPAND - Same as above; for those who can't spell. = DISPLACE - Displace the original cell with the expansion of the macro-form. There is no general way to un-do, or "go back" after this kind of displacement. = MACROMEMO - Remember the expansions is a hasharray, where the global variable MACROMEMO is a dotted pair of the number-of-buckets and the array pointer itself. All "memorized" expansions can be forgotten merely by doing (RPLACD MACROMEMO () ). = () - None of the above, i.e. merely expand the macro and return that value. Pretty-printing of forms displaced with MACROEXPANDED is controlled by the global variable GRIND-MACROEXPANDED: if T, then only the expanded form will be printed; if (), then only the original form will be printed. (Default = () ) As an aid in debugging, the global variable LAST-MACROEXPANDED-LOSER holds a ptr to the last cell visited by MACROEXPANDED 1b) The three switches relevant to macro defining time (as opposed macro expansion time) may be temporarily overridden. These switches are DEFMACRO-DISPLACE-CALL, DEFMACRO-FOR-COMPILING, and DEFMACRO-CHECK-ARGS. If the "name" part of a DEFMACRO usage is a list (instead of a symbol), then the first element is taken as the "name", and the rest of the list is treated like a form to SETQ, that is, alternating items in the list are names for the switches and a form that is evaluated to get the switch value. For example: (DEFMACRO (RLIST DEFMACRO-DISPLACE-CALL 'T DEFMACRO-CHECK-ARGS ()) (X Y) `(LIST ,y ,x)) will make a macro for RLIST which will be of the run-time displacing type as explained above, regardless of the global setting of the switch DEFMACRO-DISPLACE-CALL; also it will not insert any code into RLIST to check for proper number of args being passed. This capability, for DEFMACRO-DISPLACE-CALL, rather outdates the function DEFMACRO-DISPLACE, for any call to it could merely be replaced by a call to DEFMACRO with a temporary override of the switch DEFMACRO-DISPLACE-CALL. As a reminder, the meaning of these three switches is reproduced here: DEFMACRO-DISPLACE-CALL if non-null, the resultant macros do a runtime (default = T) test of MACRO-EXPANSION-USE for possible displacement and/or "memoizing" in a hasharray. DEFMACRO-FOR-COMPILING determines whether the macros produced will be (default = T) of the form that gets compiled by COMPLR (in either case, COMPLR "remembers" them). DEFMACRO-CHECK-ARGS determines whether there should be code to carry (default = T) out number-of-args checking at runtime. 2) OWN-SYMBOL - a declaration for disassociating any systemic properties from a symbol when compiling a file. E.g. (DECLARE (OWN-SYMBOL PUSH UNWIND-PROTECT)) will REMOB the two symbols PUSH and UNWIND-PROTECT, and thus subsequent usages of them in the file will appear to be "fresh" atoms. This is the surest way to disconnect all special knowledge that COMPLR has about a particular symbol, so that it can be used by the user in some peculiar way. 3) MACRO-EXPAND in the compiler - a macro-expander for all levels. Item 6 of the LISP RECENT note dated Jan 27, 1979, spoke about a switch EXPAND-OUT-MACROS, which affects the treatment of top-level forms which are sent out to the FASL file. The function MACRO-EXPAND is called, which performs a sort of "meta" compilation on the form, but actually only expanding out any macro usages (which would later be expanded and run during load-in time). This saves the load/run-time environment the burden of needing the whole macro-environment. This function, MACRO-EXPAND, is available to the user for his various wants, as it is on both obarrays. Saturday Jan 27,1979 LQ+7D.1H.40M.31S. LISP 1785 / COMPLR 867 -JONL- 1) EVAL-WHEN - - a new fsubr, like DECLARE but much more general 2) DEFUN permits LISP-Machine like syntax, and LET-destructuring of arguments. 3) New AUTOLOADable MACROs: LET, LET*, DESETQ; and DEFMACRO, MACRO, DEFUN& Functions MACROEXPAND and MACROEXPAND-1, defined as on LISPM, are available 4) Better error checking in *RSET mode for functions that cdr down lists: LAST now gets the last node of a non-atomic s-expression, or () for (). 5) "MACLISP" is now on the feature list, to help distinguish from LISPM. 6) COMPLR has some new switches and global variables - EXPAND-OUT-MACROS etc. 7) SUSPEND - review of meanings of arguments 8) Under the ITS operating system, a JCL line with only a means don't use any INIT file, even if the connected directory has one. This may be extended to the TOPS versions also. ____________________________________________________________________________ 1) EVAL-WHEN - - a new fsubr, like DECLARE but much more general (EVAL-WHEN ( ... ) . . . ) will cause the evaluation of the various only if the "evaluator" matches one of the indicators in the first list; these indicators may be among EVAL, COMPILE, or LOAD, which respectively trigger EVAL - a normal, read-eval-print loop COMPILE - the "maklap" processor, which compiles files LOAD - "fasload" (which only processes compiler output) (EVAL-WHEN (COMPILE) (SAY THIS)) is entirely equivalent to (DECLARE (SAY THIS)) (EVAL-WHEN (EVAL LOAD) (RUN THAT)) is generally equivalent to (RUN THAT) (EVAL-WHEN (LOAD) (PRINT '|Loading Compiled version of Foo|)) will cause the print request to appear only in the compiled FASL file, and be run at load time. (or LAP file if you don't assemble). (EVAL-WHEN (EVAL COMPILE LOAD) (SETSYNTAX '/% 'MACRO 'FUNNY-FUN)) causes evaluation in all environments, which is often what one wants with macro characters. 2) DEFUN permits LISP-Machine like syntax, and LET-destructuring of arguments. DEFUN automatically becomes DEFUN& if "&" keywords occur in the dummy argument list, or any dummy argument is not a symbol; see 3b below. 3) New AUTOLOADable MACROs: LET, LET*, DESETQ; and DEFMACRO, MACRO, DEFUN& Functions MACROEXPAND and MACROEXPAND-1, defined as on LISPM, are available from the file supporting DEFUN&, but they do not have autoload properties. LET, LET*, and DESETQ are on the same file LISP;LET FASL DEFMACRO, MACRO, and DEFUN& are on the file LISP;DEFMAC FASL In the BNF descriptions below, "{...|...}" denotes precisely one of the alternatives between the brackets and separated by vertical-bars; "{...}*" means zero or more occurances of the alternatives, "{...}+" means one or more occurances. 3a) LET, LET*, and DESETQ Following the many user definitions of a macro LET, we now have an autoload property for LET, and a definitions of it which is fairly intuitive: (LET ((A ) (B ) ... (C )) ) macro-expands into ((LAMBDA (A B ... C) ) ... ) In certain arcane instances, one wants a sequential binding, rather than the parallel binding that occurs for a multiple-variable LAMBDA; thus, LET* may be used: (LET* ((A ) (B ) ... (C )) ) macro-expands into ((LAMBDA (A) ((LAMBDA (B) ... ((LAMBDA (C) ) ) ... ) ) ) In all other respect, however, LET* is similar to LET. One especially useful feature which the MACLISP macro for LET has is that of "pattern decomposition": a general data pattern may be used in each place where a variable is expected; and for each combination of data-accessing functions which access a non-null symbol in the data pattern, there is set up a binding between that symbol and the same data-accessing path applied to the "argument" expression (that is, one of the ). Thus nullist in a pattern means "ignore". A simple example should suffice, but also a BNF description is given. (LET ( ((A . B) ) ((() C () D) ) (TEMP1) TEMP2 ) ) expands into something that operates like ((LAMBDA (G0001 G0002 A B C D TEMP1 TEMP2) (SETQ A (CAR G0001)) (SETQ B (CDR G0001)) (SETQ C (CADR G0002)) (SETQ D (CADDDR G0002)) ) () () () () () () ) Just exactly what code comes out of the LET macro depends on many things, but the intent is to "decompose" the argument, according to the structure of the pattern of variables, and bind the variables correspondingly. DESETQ is similar, but there is no "binding" involved - only "set"ing. For example, (DESETQ (A . B) (MUMBLIFY)) might become ((LAMBDA (G0001) (SETQ A (CAR G0001) B (CDR G0001))) (MUMBLIFY)) When compiled, the extra variable G0001 may not cause any noticeable slowdown in the running of such code, but if the item being destructured is denoted by a variable, then there is no new LAMBDA: (DESETQ (() C () D) XVAR) might expand into (SETQ C (CADR XVAR) D (CADDDR XVAR)) A given instance of LET or DESETQ usage will be "DISPLACED" or not depending on the value of the variable DEFMACRO-DISPLACE-CALL; See 3c below for more information about the use of this flag. In point of fact, LET is continually being extended to know about structures other than lists; thus in NIL, one may destructure thru VECTORs also, and thru a "record" created by the structure package DEFVST (currently on LIBDOC and LIBLSP). But leaving aside these more arcane data structure for now, a BNF description would be ( LET ( { | ( ) }* ) { }* ) where a "" may be a symbol, or the nullist, or any list (or "vector", or "defvst") structure. Also: ( DESETQ ) 3b) DEFUN&, for maclisp compatibility with the extended DEFUN syntax of the LISPMachine, using "&OPTIONAL" and "&REST" Also, note that if DEFUN notices the occurance of any of the keywords &OPTIONAL, &REST, or &AUX in the defining arglist, the the form is automatically turned into a DEFUN& (which may have to be autoloaded). This way, it will appear that MACLISP supports the extended syntax. Let an "" be defined by BNF as follows: ( {}* { &OPTIONAL { | ( ) }* } { &REST } { &AUX { | ( ) }* } ) Then the extended DEFUN syntax is defined by ( DEFUN { | ( ) | ( ) }+ { EXPR | FEXPR | MACRO | | } { | () | } { ( DECLARE { }* ) | | } { }* ) Note that this allow pattern decomposition at each argument position of a function definition; if a single symbol, say occurs in the optional list, it is treated as if it were of the form "( () )" - this way there is no ambiguity caused by the permission of s in the optional list, for the use of such must be in the default-value-supplied form. Also, the order of evaluation of the default values for optional arguments, and of the values for the auxillary variables, is strictly left-to-right, **after** all the non-optional argument bindings have been made. Here is an example with a lot of "bells-and-whistles" just for illustrative purposes: (DEFUN FOO ( (() NAME VARLIST . BODY) KIND &OPTIONAL (PS-FLAG (AND (EQ (CAAR BODY) 'DECLARE))) ((DNAM . DLST) (AND PS-FLAG (CADAR BODY))) &REST W &AUX (N (COND (PS-FLAG 5) (6))) ) (WORK-IT-OUT ...)) Thus FOO requires at least two arguments; and two more will be further bound, one into PS-FLAG, and the other destructured into (DNAM . DLST) 3c) DEFMACRO, MACRO -- macro-producing macros, compatible with LISPM. Three flags are noticed during instances of the macro expansions: DEFMACRO-CHECK-ARGS (default = T) DEFMACRO-DISPLACE-CALL (default = T) DEFMACRO-FOR-COMPILING (default = T) The first flag if non-null, produces a macro which checks each instance of usage for compatible numbers of "arguments"; since this checking takes time, it may not be desirable in all circumstances. The second if non-null, produces a macro which calls DISPLACE in order to displace out the original macro call. The macros MACRO-DISPLACE and DEFMACRO-DISPLACE exist, just as in the LISPM, which do not pay attention to this flag, but rather always yield a product which uses DISPLACE. The third determines which of the two macro-defining forms will be used: (DEFUN foo MACRO ...) or (DEFUN (foo MACRO) ...) If non-null, the latter will be used so that the macro will be compiled by the compiler (whereas the former format is intended primarily for macros used interpretively, or as compilation aids; see 5b below. DEFMACRO admits a "bound-variable-list" that is reminiscent of the standard argument-list processing: ( {}* {&OPTIONAL { | ( ) }+ } {&REST } ) As with DEFUN&, a single symbol, say , in the &optional list is treated as if it were of the form "( () )", for purposes of default initializations. Examples: (MACRO ERRBRK (X) (COND ((EQ (CADR X) 'BARF) '(ERR)) (`(PROG2 (PRINC ',(cadr x)) (BREAK ERROR))))) (DEFMACRO ERRBRK (MSG &OPTIONAL (BKTYPE 'ERROR)) (COND ((EQ (CADR X) 'BARF) '(ERR)) (`(PROG2 (PRINC ',msg) (BREAK ,bktype))))) 4) Better error checking in *RSET mode for functions that cdr down lists: LAST now gets the last node of a non-atomic s-expression, or () for (). In *RSET mode, the time is taken to check that no attempt is made to take the cdr of a non-null atom in the functions NTH, NTHCDR, APPEND, NCONC, REVERSE, NREVERSE, NRECONC, ASSQ, MEMQ, DELQ Regardless of the setting of *RSET, the following functions will not cdr through a non-null atom: LAST, MEMBER, ASSOC, DELETE, all MAP series. [In LISP versions prior to about 1783, LAST had the bug that it would begin cdr'ing down the plist of any symbol at the termination of a non-standard list - try (LAST '(A . CAR))]. Note however, if any of the MAP series gets expanded into a DO loop by the compiler, the endtest will be replaced by NULL rather than ATOM. 5) "MACLISP" is now on the feature list, to help distinguish from LISPM. (STATUS FEATURE LISPM) is non-null for the LISP machine (STATUS FEATURE MACLISP) is non-null for all PDP10 and MULTICS MACLISPs (STATUS FEATURE NIL) is non-null for any real or simulated NIL. 6) COMPLR has some new switches and global variables - EXPAND-OUT-MACROS etc. 6a) new switch - H for variable EXPAND-OUT-MACROS Toplevel forms which are not functions to be compiled (or other wise specially treated by MAKLAP) could be fully macro-expanded before being output to the FASL file. Normal setting is non-null meaning to do this expansion. 6b) repeat of meaning of the M switch - variable MACROS MAKLAP will not cause the compilation of a form like (DEFUN MACRO () ...) when it is processing a file, for it assumes that this macro is only for aid during compilation. If MACROS is non-null, it will also output an expr form for such a macro into the FASL file. Remember that if the definition is like (DEFUN ( MACRO) () ...), then the compiled version of the macro will always be output. In either case, COMPLR remembers the expr definition for use during the subsequent parts of the file. 6c) new variable - MAKLAP-DEFAULTF-STYLE The command line read maklap usually consists of two file specs separater by a left-arrow (underscore in new ascii); the filling in of the unspecified components of a file spec can be done either from the accumulated left-to-right mergeing, or begin separately for input and output file specs. MIDAS style is the former, and the value of this new variable either is MIDAS or (). 6d) when making up, can set feature NO-EXTRA-OBARRAY (SSTATUS FEATURE NO-EXTRA-OBARRAY) will permit CCLOAD to make up a compiler without the COBARRAY/CREADTABLE which separates user environment from compiler environment. If saving about 1.5K or so words means that much to you, and taking a chance means very little . . . 7) SUSPEND - review of meanings of arguments [Original information in the LISP NEWS file, under dates 5/22/74 JAN 13,1978 June 14,1978 ] If no arguments are given, then a return to monitor is preceeded by the message ";$Suspended$" (in ITS, it is ":Suspended", and those are alt-modes rather than dollar-signs). First arg - string for printing to exec; null; or (on ITS) small fixnum. Ordinarily, when the suspended LISP returns to the monitor, it will print the message ";$Suspended$", but a non-null symbol will be printed instead; null means continue immediately, possibly after dumping out into the file specified by the second argument. For ITS system, the message printed out will be executed by DDT, just like a string to VALRET; if the argument is a fixnum, it will be taken as the value to put in the right half of a .BREAK 16,. Second arg - file name in which to dump the pure parts of the system For ITS system, the job is PDUMPd, with an "indirect" symbol table; the pages shared with the system-dumped TS LISP are not dumped if (STATUS FLUSH) is non-null. Since a LISP tries to share its read-only pages with the system-dumped TS LISP, the only reason for allowing them to be copied out into the dump'd file when SUSPENDing is the fear that the system-dumped TS LISP may inadvertently disappear off the file system. For TOPS-10 systems (and SAIL), the high segment of a two-segment job is dumped into this file; one must still type a SSAVE (or or SAVE) at the monitor in order to dump the low segment. But if (STATUS FLUSH) is non-null, then no dumping of the high segment occurs, and it is flushed before returning to the monitor, so that when the dumped low segment is re-activated, it will try to retrieve the high segment associated with the original LISP.SHR file. Caution! As of Jan 1979, there may still be bugs in the non-its version of SUSPEND. 8) Under the ITS operating system, a JCL line with only a means don't use any INIT file, even if the connected directory has one. This may be extended to the TOPS versions also. Thursday Oct 12,1978 FQ+3D.8H.53M.53S. COMPLR 834 - JONL - [1] New command line switch "Y", causes all warning and error messages to appear on the TTY. A summary of conditions for compiler messages appears below. [2] OBARRAYs revisited: SOBARRAY and COBARRAY, also SREADTABLE and CREADTABLE. [3] Functional variables are no longer supported. "V" switch is gone. You will have to use FUNCALL if that's what you want. Beware. _________________________________________________________________________ [1] New command line switch "Y", causes all warning and error messages to appear on the TTY. A summary of conditions for compiler messages appears below. The "Y" switch controls the variable YESWARNTTY; if the "T" switch has been specified, it too will set YESWARNTTY on. Default setting for all switches is "off", except "F", "K", "O", and "U". The "U" switch primarily controls the printing of the assembler's commentary into the unfasl file; warning messages and error messages from either the compiler or assembler will be put into the unfasl file (as well as into any file on the list CMSGFILES, which is initially null), and will also be printed on the TTY if YESWARNTTY is non-null. If nothing other than the header gets put into the unfasl file, it will be deleted. If no fasl file is being produced (only the lap file is being generated), then the warning and error messages will be put into the lap file. The format of commentary in the UNFASL file is: 1) A header of three lines with source file name, assembler version number, and compiler version number, and (optionally if available) a line with the date and time of compilation. "'(THIS IS THE UNFASL FOR (fn1 fn2 dev usr))" "'(ASSEMBLED BY FASLAP /nnn)" "'(COMPILED BY LISP COMPILER /nnn)" ";COMPILED ON WEDNESDAY, OCTOBER 11, 1978, AT 12:49 PM" 2) "(COMMENT **** " begins a warning message 3) "(COMMENT **ERROR** " begins an error message 4) " (COMMENT **FASL** " begins a comment from the assembler 5) "(COMMENT " begins users COMMENTs, which are added to the unfasl file switches | warnings | errors | run break-loop | notifications T Y G | to TTY | to TTY | if find errors | to TTY ________________|__________|________|________________|______________ off off off | no | no | yes | no off off on | no | no | no | no off on off | yes | yes | yes | no off on on | yes | yes | no | no on off off | yes | yes | yes | yes on off on | yes | yes | no | yes on on off | yes | yes | yes | yes on on on | yes | yes | no | yes [2] OBARRAYs revisited: SOBARRAY and COBARRAY, also SREADTABLE and CREADTABLE. SOBARRAY is a global variable which holds the obarray containing the compiler functions; COBARRAY holds the user's functions. It is possible to create a COMPLR that has only one obarray (normally there are two - one for the compiler's functions, and one for the users') if at creation time before fasloading the COMPLR, one does (SSTATUS FEATURE NO-EXTRA-OBARRAY). Both obarray names - COBARRAY and SOBARRAY - are on both obarrays; so it is an easy matter to switch obarrays - just do (SETQ OBARRAY SOBARRAY) or (SETQ OBARRAY COBARRAY) COBARRAY is made current after quitting to LISP toplevel (such as by typing ^G), so that complr functions will not interfere with use of CHOMP. Also CREADTABLE is allied with COBARRAY in the attempt to separate user-specific syntax from the standard LISP syntax. Both names CREADTABLE and SREADTABLE are on both obarrays. Friday Oct 6,1978 NM+4D.11H.46M.53S. LISP 1747/1750 -HIC, JONL- Changes affecting all LISPs: [1] COMPLR now supports the new CATCH-like functions, and in-core compilation with the function CHOMP [2] New OPEN option: NODEFAULT Changes affecting ITS LISP: [A] New INIT file scheme supported ---------------------------------------------------------------------- Changes affecting all LISPs: [1] Compiler support for the new catch-style functions (UNWIND-PROTECT, *CATCH, *THROW, CATCHALL, and CATCH-BARRIER) is in compiler version 828 which is being released synchronously with LISP 1747. A new function in the COMPLR, "CHOMP", is from LIBLSP;CHOMP FASL. (CHOMP FUN1 FUN2 . . . FUN-M) will compile and asemble, in-core, all the m functions named, making the SUBR [or FSUBR] property to preceed the old EXPR [or FEXPR] property on the property list. Thus the compiled version will be current, but the EXPR version may be restored by REMPROPing the compiled marker. (CHOMP (FN1 FN2 DEV USR) FUN1 FUN2 . . . FUN-M) will do the same as above, but will also produce a file of FASL code named DEV:USR;FN1 FN2 [2] New OPEN option: NODEFAULT Normally, OPEN merges the user given filespec with the default filespec. Since * means omitted component, a file with a * in its name could not be looked up. To prevent merging with defaultf, and thereby allowing filenames with *'s to be looked up, use the NODEFAULT flag in the options list. Changes affecting ITS LISP: [A] New INIT file scheme supported by LISP. The new release of DDT (currently on MC, soon to be on all machines) supports a new style of INIT file as well as sophisticated HSNAME hackery. LISP now has support for both of these features. (STATUS HSNAME) returns your current HSNAME (home directory, where all init files and your mail live) This is the same as (STATUS HOMEDIR) (STATUS HSNAME foo) returns foo's home directory ("foo" is evaled) (STATUS HSNAME foo its) returns foo's home directory on the specified ITS ("foo" and "its" are evaled) (STATUS XUNAME) returns your XUNAME (his "real" name, possibly with trailing digits removed). This is the same as (STATUS USERID), but is included for compatibility with ITS names for things. The algorithm for interpreting the JCL line and for finding init files for LISP jobs is as follows: A) No JCL, look for ; LISP, if not found try ;* LISP B) JCL of the form: foo; look for foo; LISP, if not found try foo;* LISP fn1 look for ;fn1 > fn1 fn2 look for ;fn1 fn2 foo;fn1 look for foo;fn1 > for COMPLRs, it is similar: look for ; COMPLR, if not found try ;* COMPLR Sunday Sept 17,1978 FM+11H.57M.58S. LISP 1742 -HIC, JONL- Changes affecting all LISPs: [1] New autoloadable interpreter macros: backquote ("`") and LET. [2] New functions: NTH, NTHCDR, and LIST* [3] *THROW, *CATCH, CATCHALL, CATCH-BARRIER, and UNWIND-PROTECT. [4] SFA's (Software File Arrays) are implemented; see below. [5] DISPLACE now treats atomic arguments differently. [6] Minor changes to treatment of bound-variable lists. NIL is now ignored if used as a variable in bound-variable-lists. PROGV with more variables than values will make the extras "unbound" [7] OPEN now complains about illegal keywords [8] The null pname now prints as || [9] New features: SFA, EXPERIMENTAL Changes affecting ITS LISPs: [A] Planned move of autoloadable system files from COMMON; to LISP; [B] PURE now defaultly 1 [C] Arg to TTY-RETURN function is now meaningful Changes of interest to LISP internals hackers: [{] There is now a way, using some LAP or MIDAS code, to handle IOC errors Compiler changes: [i] The name "QCOMPLR" replaced by "COMPLR" [ii] COMPLR will now try to fully macro-expand any toplevel form. [iii] More on COMPLR command line switch settings, and on error messages. [iv] New names used for temporary files usage during compilation. You may find FOO _FASL_ and FOO _UNFA_ while producing FOO FASL. ---------------------------------------------------------------------- Changes affecting all LISPs: [1] New autoloadable interpreter macros: backquote ("`") and LET. The "backquote" macro and the LET macro will be autoloaded when used. The backquote macro allows generation of quoted structure with evaluated inserts, and is compatible with the LISP Machine's version. A "," within a backquote indicates evaluation of the next s-expression, and ",@" indicates not only evaluation but also that the resultant form is "spliced" into the surrounding list. For example: `(A B ,(+ 1 2)) reads in like (CONS 'A (CONS 'B (CONS (+ 1 2) 'NIL))) which when evaluated generates (A B 3) `(A B ,@(LIST 1 2)) read in like (CONS 'A (CONS 'B (APPEND (LIST 1 2) 'NIL))) which when evaluated generates (A B 1 2) One can imagine how especially helpful this will be in writing definitions of MACROs. The LET macro provides a convenient way to lambda-bind variables to values. Its usages is as follows: (LET ((var1 val1) (var2 val2) . . . (varn valn)) . . . ) One may substitute merely "var" in place of "(var NIL)" For example: (LET ((A 1) (B 2) C) ) Binds A to 1, B to 2, and C to NIL and then evaluates . An extension to the binding of one variable, is a "pattern" of variables, which are bound to the corresponding subparts of the "val"; e.g., (LET ( ((A . B) '(CONS 1 2)) ((C () D) (LIST 1 2 3))) ) would bind A to "CONS", B to "(1 2)", C to "1", and D to "3". There is an attempt by the LET macro code to optimize the destructuring operations of CAR and CDR over the original value. [2] New functions: NTH, NTHCDR, and LIST* For cdr'ing down a list, using 0-origin indexing, use NTHCDR and NTH: (NTHCDR 0 x) is just x, and (NTHCDR n+1 x) is (CDR (NTHCDR n x)) (NTH n x) is the same as (CAR (NTHCDR n x)) For compound constructions using CONS, use LIST* as if it were an LSUBR version of CONS. For example, (LIST* . . . ) evals like (CONS (CONS . . . (CONS ) . . . )) [3] *THROW, *CATCH, CATCHALL, CATCH-BARRIER, and UNWIND-PROTECT. For compatibility with the new format of CATCH and THROW in the LISP Machine, and in NIL, we are introducing *THROW and *CATCH. Please use these, and sometime in the future, CATCH and THROW in PDP10 MACLISP may be changed also. It is recommended that old code be converted to *CATCH and *THROW. (*CATCH e1 e2 ... e) Forms e1 through e are evaluated, returning the last as the value of the CATCH, unless a THROW (or *THROW) occurs whose tag matches the value of during the sub-evaluations; then the value of the catch is the value from the THROW. Note that is evaluated first. (*THROW ) Both and are evaluated as in normal SUBR control, and a control-chain break-up is initiated, passing along both values; at some higher level, the break-up will be "caught". If the "catching" is by CATCH, then the value of is passed to CATCH; if by CATCHALL, the both values are passed (q.v.). (CATCHALL e1 e2 ... e) Has same semantics as CATCH, except that if **any** THROW occurs during the sub-evaluations, then the value of the CATCH is obtained by applying the value of to the throw value and throw tag. E.g. (CATCHALL '(LAMBDA (TG VAL) ;Note that for some tags, the throw is ; repeated, so that the CATCHALL acts as ; if it in fact ignores that THROW. (COND ((MEMQ TG '(TOPLEVEL BREAK)) (THROW VAL TG)) ((OR STOPP (EQ TG 'FOO)) (THROW VAL 'FOO)) (#T VAL))) (SETUP 25) (RUNLIKE ABAT)) (CATCH-BARRIER e1 e2 ... e) Has the same syntax as CATCH, and more or less the same semantics, but if a thrown tag is not in the tag-list, then the THROW that threw it goes into an unseen-throw-tag error. The idea is that searching does not proceed back up the stack beyond this point; whereas if a THROW of a tag is not caught by a particular CATCH, then tag searching continues back up to the stack above the CATCH. (UNWIND-PROTECT u1 u2 ... u) The form will be evaluated, but if the stack is "unwound" past the point of the UNWIND-PROTECT for ANY REASON, then the unwinder must cause the evaluation, in order, of u1 through u in the environment that obtains by first unwinding to the stack point of the UNWIND-PROTECT; then the unwinding may continue. If terminates normally, then the value will be that obtained from , but the forms u1 through u will be evaluated also. The intent is that the operation of will do some things that need to be undone after sucessful completion, but which can not be undone merely by lambda-binding (eg, closing an opened file). Thus any aborting of the evaluation of will not leave undesired states hanging around. Before the u's are run, NOINTERRUPT is set to T, so that asynchronous conditions cannot cause premature termination of the handlers. It is restored to its previous value upon completion of the u's. If a THROW is done, the user must reset NOINTERRUPT to the value he wishes it to be! The UNWIND-PROTECT frame is removed from the stack BEFORE the u's are run so that they may freely do THROWS (et al.). [4] SFA's (Software File Arrays) are implemented. As the documentation on these are lengthy and is subject to change, please check the file LISP;SFA > for the latest information. [5] DISPLACE now treats atomic arguments differently. Its definition is now like: (DEFUN DISPLACE (X Y) (AND (ATOM X) (ERROR '|-- not a list. (DISPLACE)| X)) (COND ((ATOM Y) (RPLACA X 'PROGN) (RPLACD X (NCONS Y))) (T (RPLACA X (CAR Y)) (RPLACD X (CDR Y))))) [6] Minor changes to treatment of bound-variable lists. NIL is now ignored if used as a variable in bound-variable-lists. PROGV with more variables than values will make the extras "unbound" For example ((LAMBDA (A () B) (LIST A B)) '1 '2 '3) ==> (1 3) All of "'1", "'2", "'3" are evaluated, but there is no binding to NIL. And (PROGV '(A B C) '(1 2) (LIST A C)) will generate an UNBND-VRBL error. A binding is actually provided for "C", but it is the internal "UNBOUND" marker which the interpreter catches. [7] OPEN now complains about illegal keywords in the modelist. Thus, (OPEN '(FOO BAR) '(OUT MUMBLE)) will cause an error, of the WRNG-TYPE-ARG variety. [8] The null pname now prints as ||, rather than not printing at all. GRINDEF has been changed to return an asterisk. [9] Two new possible feature names have been added. SFA is in the feature list if the LISP contains SFA's, and EXPERIMENTAL is in the feature list if the LISP is considered experimental. Changes affecting ITS LISPs: [A] There is a planned move of autoloadable system files from COMMON; to LISP;. Links will be left from COMMON; to LISP; for some period of time and then those links will be flushed. All new autoloadable files will go on LISP;. Please modify any programs that explicitly look on COMMON; for autoload files to look on LISP; [B] The value of PURE now defaults to 1. Since with the new UUOLINKS scheme, uuolinks segments are added dynamically, there is only a minor loss of core when PURE is non-NIL. It is still possible to set PURE to NIL before FASLOADING any files thus not using any extra core at all. [C] The arg given by LISP to the TTY-RETURN function is now meaningful. If it is the atom IN, then LISP is hanging in one of the canonical input waits. If the LISP was not in one of the input waits, then a value of NIL is supplied as the argument. Changes of interest to LISP internals hackers: [{] There is now a way, using some LAP or MIDAS code, to handle IOC errors. The user must put an instruction to XCT in IOCINS. If LISP does not know about the PC of the IOC error (it currently does not know about any IOC errors), then the user's instruction gets XCT'ed with the PC of the error in AC R, and the error code in AC D. The user's routine must not change any AC's other than R and D, though the stacks may be used. If the XCT'ed instruction skips, the right half of R must have been set up by the user to be the PC to dispatch to after leaving interrupt level, and the left half of R to 400000+. Compiler changes: [i] The name "QCOMPLR" replaced by "COMPLR" The names "QCOMPLR", "QC", "NCOMPLR" and "N" (as well as all the "old" versions like "OQCOMPL") have been superseded by "COMPLR" and "CL" (and "OCOMPL" and "OC"). There will no longer be provided support for oldio compilers. [ii] COMPLR will now try to fully macro-expand any toplevel form. Any form in a file that the compiler would normally just pass on through to the FASL file will now be fully macro expanded, in that a "pseudo-compilation" phase is done on it to expand macros. [iii] More on COMPLR command line switch settings, and on error messages. A review of the current command line switches, and their meanings: letter | variable name | meaning ---------------------------------------------------------------------- A ASSEMBLE Source is to be assembled only (generally used on a file of LAP code - see "K" switch below) C CLOSED Generic arithmetic functions are not open-coded D DISOWNED Run the compilation disowned E EXPR-HASH Output the EXPR-HASH properties in the FASL F FASL Compile and produce FASL file (normal mode) G GAG-ERRBREAKS Don't go into break loop when finding bad data K NOLAP Don't write a LAP file, or if "A" switch is on kill the "LAP" file (which may be source file) M MACROS Output MACRO defunitions to FASL file O ARRAYOPEN Open-code the array-accessing (no error checking in the open-coded variety) S SPECIALS Treat all variables as if declared SPECIAL T TTYNOTES Prompt notes and warning msgs go to TTY U UNFASLCOMMENTS A file (second name UNFASL) of messages will be produced; warnings, errors, comments, etc. W MUZZLED Don't inform about failure to open-code generic arithmetic functions X MAPEX Open-code all MAP type functions Z SYMBOLS Assembler symbol definitions go out to FASL + FIXSW All generic arithmetic is FIXNUM only. $ FLOSW All generic arithmetic is FLONUM only. In an initialized COMPLR, only the F, K, O, U, and V switches are "on", and all others are "off". They may be set by explicit lisp code in which a non-null value for the "variable-name" means "on", or by the appearance of the "switch-letter" between parens in the command line. More of an attempt is being made not to let error msgs clog up the TTY. Warning msgs will be printed on the TTY only if TTYNOTES is non-null, and error breaks on erroneous-looking input data will be run only if not disowned and GAG-ERRBREAKS is null (default state of each variable is null) Wednesday June 14,1978 FQ+1D.8H.19M.18S. LISP 1633 -HIC- Changes that affect ITS NEWIO: [A] SUSPEND's second arg is now meaningful on ITS [B] CURSORPOS' returned value is now meaningful [C] SACONS added to XTRSYMS for graphics hackers [D] Fixnum has meaning as first arg to VALRET/SUSPEND [E] (STATUS CLI) and (SSTATUS CLI) added to enable/disable CLI interrupts Changes that affect all LISPs: [1] PUSH, POP, and DISPLACE FEXPR's in interpreter [2] SETPLIST returns its second arg [3] (STATUS FASLOAD) returns the file-object of the file currently being loaded [4] One final word on hairy defun [5] New meaningful value of *PURE: SYMBOL (doesn't cons pure SY2) Changes of interest to LISP internals hackers: [!] Internals hackers take note: XPURIFY ------------------------------------------------------------------------------ Changes that affect ITS NEWIO: [A] SUSPEND's second arg is now meaningful on ITS. If the second argument to SUSPEND is given, it is interpreted as a filename in which to pdump the LISP. An indirect symbol-table pointer is dumped (thus saving disk space) and the setting of (SSTATUS FLUSH x) is obeyed. [B] CURSORPOS' returned value is now meaningful. If the value is T, then the operation was sent to the terminal and had some affect (the appropriate ^P code is sent, though ^PC on a printing terminal does not actually clear the 'screen'.). If the value is NIL, then the ^P code was not sent and therefore nothing was done. The current setting of the TTY is looked at and a table internal to LISP is used to determine applicability. [C] The symbol SACONShas been added to XTRSYMS for use by graphics hackers. This change, along with the previous change in GETDDTSYM, obviates the need for graphics users to load symbols. [D] A fixnum as the first argument to VALRET/SUSPEND is interpreted as the value to put in the right half of a .BREAK 16,. [E] (STATUS CLI) and (SSTATUS CLI) have been added to enable/disable CLI interrupts. Unlike before, CLI interrupts are defaultly OFF [(SSTATUS CLI NIL)]. Therefore, people setting CLI-MESSAGE must do an (SSTATUS CLI T) in order to actually recieve the interrupts. Changes that affect all LISPs: [1] PUSH, POP, and DISPLACE in interpreter: FSUBR: (PUSH X L) ==> (SETQ L (CONS X L)) FSUBR: (POP L) ==> (PROG2 () (CAR L) (SETQ L (CDR L))) FSUBR: (POP L X) ==> (PROG2 () (SETQ X (CAR L)) (SETQ L (CDR L))) SUBR: (DISPLACE X Y) ==> (PROGN (RPLACA X (CAR Y)) (RPLACD X (CDR Y)) X) [2] SETPLIST returns its second argument. [3] (STATUS FASLOAD) returns the file-object of the file currently being loaded. [4] The one final word on hairy defun is that the first atom in a DEFUN is ALWAYS interpreted as the function name. Therefore: (DEFUN MACRO FEXPR ...) defines a FEXPR called MACRO, and not vice-versa. [5] New meaningful value of *PURE: SYMBOL. If *PURE contains SYMBOL then everything EXCEPT symbols will be pure-consed. THis was added for use in a new Macsyma loader, and may not be of general use. Changes of interest to LISP internals hackers: [!] Internals hackers take note: XPURIFY has been added as an alternaate entry to the PURIFY routine. If you XPURIFY$G, then the LISP will expect itself to be :PDUMP'ed to LISP;PURQIX nnnn instead of SYS;PURQIO nnnn. This is usefull for creating experimental LISP versions. THURSDAY MAY 25,1978 FM+3D.8H.53M.31S. NCOMPLR 769 -JONL- Finally! A new QCOMPLR is out, which corrects many bugs noted during the past year, and implements several new features. [1] Many calls to CONS, LIST, NCONS, XCONS, etc are now coded as fast JSP-type subroutine calls. These calls cannot be linked-up in LISPs prior to version number 1493. [2] The version number of the compiler is kept in the global variable COMPLRVERNO; this used to be "INIT1". Recall that the FASLAP version number is in FASLVERNO. [3] There is no longer any NOARGS feature, nor ARGSP functional; if you don't know what this means, don't worry about it. [4] A list of all the compiler-command-line switches is kept in the global variable SWITCHTABLE along with standard settings, which have been changed to (FKOUV). This means that normal operation is to compile a file, producing a FASL output and UNFASL comments file, but no LAP. The "I" switch now permits specifying a file to be loaded just after the normal compiler initialization routine is done [5] Several standard macro definitions have been added, as well as a macro expander for CASEQ. (See the LISP RECENT note of Jan 26, 1978, for syntax of CASEQ. Also, see below.) The new macros are PUSH, POP, LET, and DISPLACE. [6] A new feature has been added for load-time evaluations (that is, at fasload time), dubbed SQUID for "Self-QUoting Internal Datum". The value of the symbol SQUID, in the compiler, is an atom specially reserved for this purpose, which is used much like the atom QUOTE. [7] Many old bugs have been fixed, probably too many to enumerate individually; but we could mention specifically [7a] (DEFUN (FOO MUMBLE) . . .) (DEFUN (FOO GHAST) . . .) will now correctly define these two pseudo functions. [7b] CGOL files should compile ok now. [7c] Error messages come out on the TTY if so requested. [7d] The error signalled by "NO FREE REGACS" should go away. [7e] Some cases of incorrect code output have been fixed. [8] A top level call to LAP-A-LIST with a quoted argument is specially recognized and treated as if it were a standard LAP call. ____________________________________________________________________________ [4] A list of all the compiler-command-line switches is kept in the global variable SWITCHTABLE along with standard settings; The format is ((A ASSEMBLE NIL) ... (Z SYMBOLS NIL)) Each item in the list is a 3-list: a letter used as the switch request in the command parser, a variable name used as the global variable holding the value of the switch, and an initial setting. Only about 15. letters are currently in use, so the user could add to this table if he would like to set up some switches of his own. SWITCHTABLE starts out sorted alphabetically by switch-letter, and if you want to see a list of all letters currently in use, do (MAPCAR 'CAR SWITCHTABLE). Note well, that the INITIALIZE function resets the switches to their initial values. The standard switch settings have been changed to (FKOUV), which is to say that normal operation is to compile a file, producing a FASL output and UNFASL comments file, but no LAP. Furthermore, annotations to the TTY are not requested, and the V switch is in cooperation with the recently announced non-feature, the dropping of a certain evaluator anomaly destribed under (STATUS PUNT). If the "I" switch is specified, it means "do a standard initialization before compiling another file"; this is often helpful when several files are being used as sources for the compiler. A problem arises however because this initialization will remove MACRO properties, and other properties put on symbols by DECLARE; thus if a user has a file with all the necessary actions in it, he may specify that that file be LOADed just after the initialization by placing the file namestring between square brackets, just after the "I". E.g., FOO FASL_FOO >(TWI[usr;CMPSET >]) [5] Briefly, CASEQ looks like a kind of cond, in which one item is evaluated, and the remaining items are like COND clauses; the predicate test at each clause is essentially MEMQ of evaluated item and list at first of clause. The item must be either a SYMBOL or a (non-BIGNUM) number; the various keys in the clause-lists must be then either all symbols, or all fixnums, or all flonums. Two exceptions are added for convenience: If a clause has an atom as its first element, then it is interpreted as if it were a singleton list of that atom, except that if such atom is the symbol T, then that clause unconditionally succeeds. Example: (CASEQ (COMPUTATE-VAL) ((3 5 7 11. 13. 17. 19.) 'PRIME) (1 'UNITY) ((2 4 8 16.) 'TWO-POWER) (T 'RANDOM)) The others expand as follows: (PUSH X L) ==> (SETQ L (CONS X L)) (POP L) ==> (SETQ L (CDR L)) (POP L X) ==> (SETQ X (PROG2 NIL (CAR L) (SETQ L (CDR L)))) (LET ((V1 E1) (V2 E2) . . . (VN EN)) F1 F2 . . . FK) ==> ((LAMBDA (V1 V2 . . . VN) F1 F2 . . . FK) E1 E2 . . . EN) DISPLACE is intended for use as a macro-displacing function; thus if (DEFUN FOO MACRO (X) (MUMBLE X)) is a macro definition, then (DEFUN FOO MACRO (X) (DISPLACE X (MUMBLE X))) will cause the macro call to be displaced by its code after the first expansion. [6] SQUID Feature Test Module (DECLARE (SETSYNTAX '/% 'MACRO '(LAMBDA () (LIST SQUID (READ)))) (SPECIAL FIRSTVAR SECONDVAR)) %(+ 1 2) (SETQ FIRSTVAR %(+ 1 2)) '(A %(+ 1 2) B) (SETQ SECONDVAR '(A %(+ 1 2) B)) (DEFUN MACFUN MACRO (FORM) %(+ 3 4)) (DEFUN TESTFUN () (LIST (MACFUN) %(+ 5 6) '(A %(+ 7 8)))) Notice how the read-macro gives the impression of designating a subexpression, even of a quoted form, to be evaluated at load time. Note also, how SQUID at top level acts like QUOTE. Monday, May 15,1978 FQ+18H.41M.47S. LISP 1578 --GLS, HIC, JONL-- Changes that affect all LISP's: [A] The result of (STATUS SYSTEM foo) contains SYMBOL if foo is a system symbol [B] FLONUM's are allowed in the ALLOC function but not in the INIT file [C] Changes to purification in general (**PURE SYSTEMS BUILDERS TAKE NOTE**) [D] New version of the TRACE package [E] GETDDTSYM checks LISP's built-in table before looking at the symbol table [F] Two hooks into toplevel/break READ-EVAL-PRINT loop [G] More information on the LENGTHF function (NEWIO only) [H] CNAMEF: semi-new undocumented function now being documented Changes that affect ITS LISP's: [1] FLUSH status option allows removal of LISP's pure pages on a suspend [2] Changes to UUOLINKS segments allows them to be extendable [3] .XUNAME now used to find INIT file An inquiry: [!] Which is more useful: (STATUS SEGLOG) or (STATUS SEGSIZE) Items of interest to LISP internals hackers: [{] More symbolic definitions [|] New SY.OTC bit in SY2 [}] Internal purification changes ------------------------------------------------------------------------- Changes affecting all LISP's: [A] The result of (STATUS SYSTEM foo) contains SYMBOL if foo is a system symbol. Previously, (STATUS SYSTEM 'LAMBDA) would return nil, and this was clearly wrong. Therefore, in addition to anything else that was previously returned by this STATUS function, SYMBOL will be returned for all symbols in the initial system. [B] FLONUM's are allowed in the ALLOC function but not in the INIT file. Previously FLONUM's were allowed only as the last of the set of three args for each space. The restriction of not allowing flonums in the INIT file is that at the time the INIT file is read, no FLONUM consing is allowed. If you do use FLONUM's in the INIT file comment, you will find that the LISP will get a fatal error. [C] Changes to purification in general (**PURE SYSTEMS BUILDERS TAKE NOTE**): There have been several changes to the purification scheme that make it more consistent, and apparently more correct. Previously, COPYSYMBOL would return a pure symbol if *PURE was non-nil, now COPYSYMBOL always returns an impure symbol. In earlier LISP's, all symbols consed while *PURE was non-nil would go into pure space. This included things like GENSYM's. Now, only INTERN'ed symbols (such as produced by READ) will be purified. PURCOPY on a symbol now purifies as much of the symbol as possible, whereas previously only the PNAME was purified. These changes, along with the corresponding internal changes, seem to be effective in producing more correct purification actions. For example, MACSYMA and NCOMPLR have been observed to get smaller due to less garbage collectable stuff being consed in pure space. [D] A new version of the TRACE package has been installed. The fasl for old Trace is Comlap;Trace Ofasl. In new Trace, there is a way to trace a macro as if it were a function: (Trace (Macr Macroval)) will give the same Entry print, but on Exit prints the final result (after Eval) of the Macro-call. You can also trace the old way with a regular Trace call without interfering with this (misfeature?). Currently, Macroval doesn't do error-checking, so (Trace (Cons Macroval)) will screw up. [E] GETDDTSYM checks LISP's built-in table before looking at the symbol table. This should allow people building systems that GETDDTSYM common symbols to not have to load all the symbols into their DDT, and should also allow Tops-10 GETDDTSYM to win in more cases. [F] Two hooks into toplevel/break READ-EVAL-PRINT loop: The two symbols READ-*-EVAL-PRINT and READ-EVAL-*-PRINT allow intercepting the read-eval-print loop in the position indicated by the *. The symbols should be bound to the name of the function to be invoked. Each is a function of one argument, and the value returned is used in lieu of the function's argument (which would normally be passed on to the next function in the loop). The functions are run both at top level and at break level. [G] More information on the LENGTHF function (NEWIO only) It has been brought to our attention that the description of the LENGTHF function was lacking. The value returned by the LENGTHF function applied to a file-object is the length in 'bytes' of the file. The byte size is determined by the mode the file was opened in. For ASCII mode, the byte size is 7, and for FIXNUM mode the byte size is 36. Therefore, for FIXNUM files, the value returned is the size of the file in words, which is 5 times less then the size of the file in characters. Note that this value is also the highest value that may be used as an argument to FILEPOS for an input file. [H] CNAMEF: semi-new undocumented function now being documented (CNAMEF ) replaces the filename in the closed file-object by the filename specified in the second argument. This is useful if the creation of extra file arrays is either not desirable or possible. Changes that affect ITS LISP's: [1] The FLUSH status option allows removal of LISP's pure pages on a suspend. If a (SSTATUS FLUSH T) is done before a SUSPEND, LISP will flush its pure pages from its page map before returning to DDT. This saves about 28 pages in a PDUMP'ed file. NOTE THAT USING THIS OPTION REMOVES SOME ROBUSTNESS FROM YOUR SAVED SYSTEM!!! [2] Internal changes to the UUOLINKS segments allow them to be extendable. In older LISP's, the value of PURE was taken to be the number of pages to be allocated to the UUOLINKS area. Now, the value of PURE is ignored and as long as it is a FIXNUM, UUOLINKS are allocated segment by segment when new segments are required. Note that UUOLINKS segments may now be added even after a system has been purified thus allowing multi-level pure systems to be built up. [3] The XUNAME is now used to find the default INIT file. Formerly, the SNAME was used, but this was inconsistent with the function of other programs. Now, $$^S will affect the place that files are defaultly read from, but NOT from where INIT files are read from, whereas $^S can be used to change the source of INIT files, but not the default directory. An inquiry: [!] Which is more useful: (STATUS SEGLOG) or (STATUS SEGSIZE)? Currently, (STATUS SEGLOG) returns the log base 2 of the segment size. We postulate that the actual segment size is more useful, and therefore are considering removing SEGLOG in favor of SEGSIZE. Are there any opinions on this matter? Items of interest to LISP internals hackers: [{] More symbolic definitions have been introduced. There are now symbolic definitions for the bits in the first word of an SY2 block. To use '?' typeout mode use the prefix 'SY.'. The ST (segment) table bits have also been defined under the prefix of 'ST.'. [|] There is a new bit in the first word of SY2. The SY.OTC bit is set when SY.CCN (compiled code needs me) is on and the referencer is other then a CALL uuo (hence the name, Other Then Call, or OTC). [}] In order to impliment the new purification scheme, there have been some changes to the internal purification routines. The symbol conser (SYCONS) has been split into two consers: SYCONS for impure symbols and PSYCONS for pure symbols. Note that this is consistent with the other pure/impure consers. Thursday March 23,1978 FQ+7D.3H.39M.38S. LISP 1513 --HIC, GLS, JONL-- Changes that affect ITS NEWIO only: [1] New SCROLL option for TTY's [2] New STATUS option: OSPEED [3] Change in CURSORPOSable terminal definition [4] New symbols with AUTOLOAD property: CREATE-JOB, LEDIT Changes that affect all NEWIO's: [a] New function: LENGTHF Changes that affect all LISP's: [A] New functions: *READCH, *TYI, *READ General announcement: [!] TOPS-10 NEWIO is here! Changes of interest only to LISP internals pathologists: [@] DBGMSK now has %PIATY off ---------------------------------------------------------------------- Changes that affect ITS NEWIO only: [1] There is now a new OPEN option for TTY's. If SCROLL mode is specified in the option list, or if it has been set in the TTY status variable, LISP will handle the scrolling correctly. Before this option, scrolling could lose on MOREing. If the terminal is not in scroll mode, ITS will be informed of the fact that scrolling is requested so that normal output will cause the display to scroll. [2] New STATUS option: OSPEED. (STATUS OSPEED ) returns the speed in BAUD of the TTY open on . To obtain the speed of the controlling terminal, (STATUS OSPEED TYO) may be used. [3] There has been a slight change in the definition of a terminal to which LISP will output ITS display (control-P) codes. If the %TOMVB (move back) bit is set, LISP will treat the terminal as a display. Previously, the %TOMVU (move up) bit was checked, and would cause misfunction on GLASS TTY's. We are contemplating making LISP smarter about terminal types so that the value returned from CURSORPOS (T for succesful operation, NIL for failure) will actually reflect whether the operation was performed on the terminal. Comments about the display handling scheme are solicited. [4] CREATE-JOB has autoload property of COM:HUMBLE FASL LEDIT has autoload property of COM:LEDIT FASL Changes that affect all NEWIO's: [a] A new function has been added which returns the length of an input file. (LENGTHF ) returns the length of the input file open on . Changes that affect all LISP's: [A] *READCH, *READ, *TYI are new functions added mainly for the benefit of the compiler. They are SUBRs of zero arguments and function the same as their counterparts (READCH, READ, TYI) with no arguments given. General announcement: [!] TOPS-10 NEWIO is now alive. It has been running on some DECsystem-20's under the TOPS-10 simulator and has run fine on standalone TOPS-10's. Unfourtunatly, it has not had widespread distribution. Any TOPS-10 site interested in obtaining a copy of NEWIO should send a note to BUG-LISP and we will try to accomodate you. We need it to be used in the field if we are to have any hopes of making it solid. Changes of interest only to LISP internals pathologists: [@] Of interest to LISP internals pathologists is the fact that DBGMSK now has the %PIATY bit off. If you are debugging a LISP in which the program enables TTY-RETURN interrupts, you would lose badly. Now, setting IMASK and .MASK to DBGMSK will turn off TTY-RETURN interrupts and allow simpler debugging. SUNDAY FEB 26,1978 FM+4D.3H.23M.22S. LISP 499 --HIC, GLS, JONL--- NOTICE: AS THIS "LISP RECENT" COMES SHORTLY AFTER THE PREVIOUS "LISP RECENT", IT WILL BE APPENDED TO THE FRONT OF RATHER THAN SUPERCEDING THE PREVIOUS ONE. CHANGES THAT AFFECT ALL USERS: [1] YOUR DEFAULT INIT FILE IS NOW AUTOMATICALLY READ BY LISP [2] REMINDER: LSUBR CONS HAS BEEN REMOVED CHANGES THAT AFFECT ITS NEWIO: [A] ARGUMENT OF T TO DIRECTORY FUNTION IS NOW MEANINGFUL ---------------------------------------------------------------------- [1] WHEN LISP IS STARTED UP YOUR DEFAULT INIT FILE WILL BE READ IN WITHOUT INTERVENTION. TO PREVENT READING IN THE INIT FILE, IT IS NECESSARY TO GIVE A JCL CONTAINING ONLY SPACES SO: :LISP READS YOUR INIT FILE WHEREAS: :LISP DOES NOT. NOTE THAT A DIFFERENT INIT FILE MAY BE SPECIFIED IN THE JCL AS BEFORE. [2] LSUBR CONS, WHICH WAS ADDED A FEW RELEASES AGO, HAS BEEN REMOVED. IT HAS ACTUALLY BEEN REMOVED FOR A WHILE, BUT IT IS BEING DOCUMENTED IN LISP RECENT FOR THE FIRST TIME. AS THERE WERE SOME PROBLEMS WITH THE NEW FORM OF CONS, AND THERE WAS NO COMPILER SUPPORT FOR IT, WE DECIDED TO REMOVE THE NEW CONS UNTIL THINGS COULD BE BETTER WORKED OUT. AN ANNOUNCEMENT WILL BE MADE WHEN LSUBR CONS RETURNS. [A] AN ARGUMENT OF T TO THE DIRECTORY AND MAPDIRECTORY FUNCTIONS IS NOW MEANINGFUL. A CALL IS OF THE FORM: (DIRECTORY []) IF PROPS-TO-RETURN IS OMITTED, THEN A SELECTED SUBSET OF THE FILE PROPERTIES IS RETURNED. IF PROPS-TO-RETURN IS T, ALL OF THE AVAILABLE PROPERTIES WILL BE RETURNED. IF PROPS-TO-RETURN IS NIL, NO PROPERTIES ARE RETURNED. PROPS-TO-RETURN MAY BE A LIST IN WHICH CASE IT EXPLICITLY STATES THE PROPERTIES TO BE RETURNED. SUNDAY FEB 19,1978 FQ+4D.11H.48M.14S. LISP 493 -GLS, HIC, JONL- IMPORTANT NOTIFICATION REGARDING UPCOMING CHANGE: [!] IN THE NEXT VERSION OF LISP, INIT FILES WILL ALWAYS BE READ UPON STARTUP CHANGES THAT AFFECT NEWIO ONLY: [A] UREAD NOW RETURNS TRUENAME OF FILE RATHER THAN FILE NAME AS GIVEN [B] THERE IS NOW AN AUTOLOAD PROPERTY ON THE INF-EDIT FUNCTION FOR LISPT USERS [C] THERE IS NOW AN AUTOLOAD PROPERTY ON THE LAP-A-LIST FUNCTION [D] FUNCTIONAL VARIABLES ARE NOW UNDER A STATUS/SSTATUS SWITCH CHANGES THAT AFFECT ALL VERSIONS: [1] EXP NOW ACCEPTS ARGUMENTS UP TO 88.0 ---------------------------------------------------------------------- [!] IN THE NEXT RELEASE OF LISP YOUR DEFAULT INIT FILE (THE ONE YOU WOULD GET IF YOU TYPED ^Q TO ALLOC QUESTION) WILL DE LOADED WHEN LISP IS STARTED FOR THE FIRST TIME. THE FILE THAT IS READ CAN BE MODIFIED BY GIVING LISP A JCL LINE (AS ALWAYS). THERE WILL BE NO WAY, WITHIN LISP, TO TURN THIS FEATURE OFF. WHAT THIS MEANS IS THAT LISP WILL NOW HANDLE INIT FILES IN THE WAY THAT MOST OTHER SYSTEM PROGRAMS, SUCH AS EMACS, HANDLE THEM. [A] UREAD NOW RETURNS THE VALUE OF THE FUNCTION TRUENAME APPLIED TO THE FILE OPENED BY UREAD. YOU CAN THEREFORE SEE EXACTLY WHAT FILE IS BEING PROCESSED. [B] THE INF-EDIT FUNCTION, WHICH IS THE WAY IN WHICH THE EDITING PACKAGE LISPT IS INVOKED, NOW HAS A SYSTEM AUTOLOAD PROPERTY. [C] THE FUNCTION LAP-A-LIST NOW HAS AN AUTOLOAD PROPERTY. LAP-A-LIST IS A FUNCTION WHICH IS USED BY LAP AFTER IT BUILDS A LIST OF THE USERS INPUT. IT IS FELT THAT USERS WANTING TO GENERATE LAP CODE VIA PROGRAMS AND PASS IT TO LAP TO BE PROCESSED CAN MORE EASILY GENERATE A LIST OF LAP EXPRESSIONS RATHER THAN PUTTING UP WITH THE FUNNY INTERFACE TO LAP AS IS CURRENTLY REQUIRED. LAP-A-LIST TAKES AS ITS ARGUMENT A LIST WHICH IS SIMPLY A LIST OF THE INDIVIDUAL LINES THAT WOULD NORMALLY BE FED TO THE LAP PROGRAM. [D] WE PLAN TO FLUSH FUNCTIONAL VARIABLES IN THE NEAR FUTURE. AS AN INTERIM MEASURE, WHETHER OR NOT AN ATOM IN A FUNCTIONAL POSITION IS EVALUATED IS DETERMINED BY THE SETTING OF THE 'PUNT' STATUS FLAG. WHEN (STATUS PUNT) IS T, EVALUATION OF FUNCTIONAL VARIABLES WILL BE SKIPPED (PUNTED?). THE FLAG IS DEFAULTLY T, AND SHOULD BE SET TO NIL BY THE USER IF UNDEFINED FUNCTION OBJECT ERRORS ARISE IN PREVIOUSLY FUNCTIONING PROGRAMS. NOTE THAT SINCE FUNCTIONAL VARIABLES ARE GOING TO BE FLUSHED ALL TOGETHER AT SOME FUTURE DATE, IT IS BEST LEAVE THE FLAG ON IN ORDER TO INSURE THAT YOUR PROGRAMS WILL FUNCTION CORRECTLY WHEN FUNCTIONAL VARIABLES ARE COMPLETELY REMOVED. [!] AS E^88.0 IS INDEED REPRESENTABLE, IT HAS BEEN DECIDED TO EXTEND THE LEGAL INPUT VALUES FOR THE EXP FUNCTION. NOTE THAT THE ACCURACY OF THIS FUNCTION AT THE HIGHER VALUES MIGHT BE REDUCED. THURSDAY JAN 26,1978 FM+2D.9H.23M.18S. LISP 472 -GLS, HIC, JONL- THINGS WE WOULD LIKE TO KNOW: [A] INPUT/OUTPUT BASES DEFAULTING TO DECIMAL [B] FUNCTION CELLS [C] ERROR HANDLING [D] DOTS IN DOTTED PAIRS REQUIRING A SPACE ON BOTH SIDES CHANGES THAT AFFECT ALL VERSIONS: [1] NEW SYNTACTIC CONSTRUCT: CASEQ [2] *RSET DEFAULT IS NOW T [3] CONS IS NOW AN LSUBR (!) [4] LIMITATION ON LENGTH OF VALRET STRINGS HAS BEEN REMOVED CHANGES THAT AFFECT SAIL VERSION: [!] VALRET WILL NOW DO A PTLOAD, TO LOAD ARGUMENT INTO LINE EDITOR -------------------------------------------------------------------- PLEASE ANSWER THE FOLLOWING QUESTIONS IF YOU FEEL THEY HAVE A BEARING ON YOUR ACTIVTIES BY SENDING MAIL TO BUG-LISP: [A] SHOULD THE DEFAULT BASE FOR INPUT AND OUTPUT BE DECIMAL? IF SO, WHAT SHOULD BE USED FOR AN OCTAL 'POINT'? [B] WE ARE CONSIDERING IMPLEMENTING 'FUNCTION CELLS'. THESE WOULD HOLD THE FUNCTIONAL PROPERTIES OF AN SYMBOL. THIS CHANGE WOULD REMOVE THE ABILITY TO USE PUTPROP/DEFPROP/GET TO HACK FUNCTIONAL PROPERTIES. SUGGESTIONS ARE SOLICITED. [C] WE ARE ALSO CONSIDERING IMPROVING THE ERROR HANDLING FACILITIES AND WOULD APPRECIATE INPUT ON THE TYPES OF THINGS THAT ARE DESIRED. [D] SHOULD THE DOT IN DOTTED PAIRS *REQUIRE* A SPACE ON EACH SIDE? IF NO SPACE WAS PRESENT THE DOT WOULD BE CONSIDERED EITHER A DECIMAL POINT OR PART OF A SYMBOL. THE FOLLOWING APPLY TO ALL SYSTEMS: [1] THERE IS A NEW TYPE OF CONDITIONAL NAMED 'CASEQ'. (CASEQ ( E1 E2 ... EN) ;CLAUSE 1 ( E1 E2 ... EN) ;CLAUSE 2 ... ( E1 E2 ... EN)) ;CLAUSE M MUST EVALUATE TO EITHER A SYMBOL OR A FIXNUM. ALL OF THE KEYS IN THE KEY-SETS MUST BE OF THE SAME TYPE, EITHER SYMBOL OR FIXNUM, AND MUST BE OF THIS SAME TYPE ALSO. IS EITHER THE ATOM T, A RANDOM ATOM (SYMBOL OR FIXNUM), OR A LIST OF ATOMS (SYMBOLS OR FIXNUMS). IF IT IS THE ATOM T, THE EXPRESSIONS FOLLOWNG IT ARE EVALUATED UNCONDITIONALLY. THIS SHOULD OCCUR ONLY IN THE LAST CLAUSE, IF AT ALL. IF IS A SINGLE ATOM (OTHER THAN T), THEN IF IT MATCHES THE FOLLOWING EXPRESSIONS ARE EVALUATED. IF A LIST OF ATOMS IS PRESENT, THEN EACH ATOM IS MATCHED AGAINST AND THE EXPRESSIONS ARE EVALUATED IF ANY ATOM MATCHES. THE ATOMS IN THE ARE NEVER EVALUATED. "MATCHING" MEANS EQ FOR SYMBOLS AND = FOR FIXNUMS. THE VALUE OF CASEQ IS THE VALUE OF THE LAST EXPRESSION EVALUATED IF A MATCH IS FOUND, ELSE NIL. IT IS NOT USEFUL FOR A GIVEN KEY TO APPEAR MORE THAN ONCE AMONG ALL THE KEY-SETS OF A SINGLE CASEQ. THE IDEA OF CASEQ IS TO PROVIDE A DISPATCHING CONSTRUCT. A "T-CLAUSE" PROVIDES AN "ELSE" CASE FOR WHEN NO EXPLICITLY GIVEN KEYS MATCH. EVENTUALLY WE HOPE THAT CASEQ ON FIXNUMS, AT LEAST, WILL COMPILE ESPECIALLY WELL, INTO A KIND OF FORTRAN-STYLE COMPUTED GOTO. [2] THE DEFAULT VALUE OF *RSET IS NOW T. [3] CONS IS NOW AN LSUBR. (CONS A B C D) <==> (CONS A (CONS B (CONS C D))) (CONS A) <==> A IN OTHER WORDS, IT RIGHT-ASSOCIATES. (CONS A B C D NIL) = (LIST A B C D), BUT ON THE LISP MACHINE THEY MAY HAVE DIFFERENT CONNOTATIONS WITH RESPECT TO STORAGE ALLOCATION. [4] THE LIMITATION ON THE LENGTH OF VALRET STRINGS HAS BEEN REMOVED FOR ALL PRACTICAL PURPOSES. [!] IN SAIL VERSION, VALRETTING A STRING NOW LOADS THE STRING INTO THE LINE EDITOR VIA PTLOAD. FRIDAY JAN 13,1978 NM+4D.23H.1M.55S. LISP 383 -GLS, HIC- [@] SOME CHANGES IN NOMENCLATURE FOR VARIOUS VERSIONS [1] LAST MOST FINAL DOCUMENTATION OF THE HAIRY DEFUN FEATURE [2] (STATUS JNUMBER) RETURNS A JOB NUMBER [3] NEW EDIT COMMAND: YV FOO YANKS VALUE OF FOO [A] FILEPOS CAN TAKE T AND NIL AS POSITION SPECIFIERS [B] MEANINGS OF T AND NIL WHERE A FILE OBJECT IS REQUIRED [C] NEW IO-LOSSAGE ERROR FOR AN INVALID VALUE OF MSGFILES [D] SLIGHT INCOMPATIBILITY: UREAD AND UFILE NOW RETURN A FULL NAMELIST [E] UAPPEND NO LONGER RENAMES THE FILE ON OPENING IT [F] FOR THE RECORD, COMPLETE DEFINITIONS OF OLDIO IN TERMS OF NEWIO [G] RENAMEF AND DELETEF OF A FILE OBJECT NOW CLOSE THE FILE OBJECT [H] ALL ITS NEWIO I/O IS NOW DONE WITH SIOT SOME FEATURES PRESENTLY IMPLEMENTED ONLY FOR THE SAIL VERSION: [!] SAIL VERSION NOW USES TWO SEPARATE DISK FILES FOR SAVED LISPS ["] INITIALIZATION AUTOMATICALLY SAVES A HIGH SEGMENT [#] FASLOAD CAN LOAD INTO THE HIGH SEGMENT [$] HIGH-SEGMENT PURE FREE STORAGE [%] SUSPEND NOW TAKES ONE OR TWO ARGUMENTS SOME THINGS PROBABLY OF INTEREST ONLY TO LISP SYSTEM HACKERS: [{] NEW INTERNAL ROUTINES %CONS, %HUNK, ETC. SOLVE A PDLNMK PROBLEM [|] INITG IS NOW INITIALIZEG, TO PREVENT CONFLICT WITH DEC-10 INIT UUO [}] NEW MACROS PUSHN AND POPI ARE USED IN THE SOURCE [~] THE FORMAT OF FILE OBJECTS HAS CHANGED SOME - REASSEMBLE CODE IF NECESSARY ---------------------------------------------------------------- [@] THERE ARE MANY, MANY VERSIONS OF MACLISP FLOATING AROUND. EVEN JUST ON THE PDP-10, THERE ARE MANY BECAUSE OF THE POSSIBILITIES OF CONDITIONAL ASSEMBLY. WORK IS PROCEEDING APACE ON VERSIONS FOR THE TENEX AND TOPS-20 OPERATING SYSTEMS, AND ON NEWIO VERSIONS FOR SAIL AND TOPS-10. HERE WE LAY OUT SOME STANDARD NOMENCLATURE FOR THE VARIOUS VERSIONS. THE VARIOUS NAMES FALL INTO SETS WHICH REPRESENT ORTHOGONAL CHOICES. OPERATING SYSTEM: / ITS | / TOPS-10 | DEC-10 | SAIL PDP-10 | \ CMU | / | DEC-20 | TENEX \ \ TOPS-20 (AKA "TWENEX") MULTICS THE PDP-10 VERSION WILL EVENTUALLY RUN ON SIX DIFFERENT OPERATING SYSTEMS. TOPS-10, SAIL, AND CMU ARE SUFFICIENTLY SIMILAR TO WARRANT LUMPING THEM TOGETHER AS "DEC-10"; SIMILARLY TENEX AND TOPS-20 ARE LUMPED TOGETHER AS "DEC-20". MULTICS, OF COURSE, IS NOT A PDP-10 VERSION. PROCESSOR: KA10 KI10 KL10 THE KA10 VERSION WILL RUN ON ALL PROCESSORS; THE KI10 VERSION WILL RUN ONLY ON KI10 AND KL10 PROCESSORS; AND THE KL10 ONLY ON KL10'S. SO FAR WE HAVE BEEN GENERATING ONLY KA10 VERSIONS; WHEN THE NEW NUMBER STUFF IS IMPLEMENTED, THIS CHOICE WILL BECOME MORE IMPORTANT. I/O IMPLEMENTATION: OLDIO (UREAD, UWRITE, ETC. *ONLY*) NEWIO (MULTIPLE I/O CHANNELS; ALSO SUPPORTS UREAD) MINIMALITY: MINIMAL (FANCY FRILLS NOT INCLUDED) USELESS (FANCY "USELESS" FRILLS ARE INCLUDED) THE FRILLS INCLUDE THE GCD FUNCTION, PURIFY AND FRIENDS, AND LOTS OF LITTLE I/O HACKS LIKE ROMAN NUMERALS AND PRINLEVEL/PRINLENGTH. THE MINIMAL VERSION IS USUALLY USED ONLY FOR DEC-10 VERSIONS WHICH MUST RUN ON MACHINES WITH LITTLE PHYSICAL MEMORY; HOWEVER, IT IS AN OPTION INDEPENDENT OF OPERATING SYSTEM. ARITHMETIC: BIGNUMS DOUBLE-PRECISION FLONUMS COMPLEX NUMBERS THESE THREE ARE INDEPENDENT CHOICES WHICH MAY BE PRESENT OR ABSENT. THUS, TO IDENTIFY THE VERSION PRESENTLY RUNNING AT MIT-AI, WE MIGHT SAY "THE ITS KA10 NEWIO USELESS BIGNUM VERSION". [1] THE FOLLOWING ARE THE OFFICIAL SPECS FOR THE "HAIRY DEFUN" FEATURE, WHEREIN THE NAME OF THE FUNCTION IS ACTUALLY A LIST OF GOODIES. IF THE INTERPRETER OR COMPILER DOESN'T ACTUALLY DO WHAT FOLLOWS, IT'S A BUG. (UP TO NOW WE HAVEN'T BEEN ABLE TO DISTINGUISH BUGS AND MISFEATURES BECAUSE WE WEREN'T SURE PRECISELY WHAT THE FEATURE SHOULD DO IN ALL CASES.) THE GENERAL FORM OF A CALL TO DEFUN IS: (DEFUN . ) AND MAY BE INTERCHANGED. MAY BE OMITTED, OR MAY BE "EXPR", "FEXPR", OR "MACRO". MAY BE A SYMBOL (THE NAME OF THE FUNCTION), OR A LIST OF TWO TO FOUR SYMBOLS (IN WHICH CASE THE FLAG "MACRO" IS ILLEGAL). IS A NON-NIL SYMBOL OR A LIST OF SYMBOLS; THE FORMER INDICATES AN LEXPR (INCOMPATIBLE WITH THE "MACRO" AND "FEXPR" FLAGS). IF THE VALUE OF THE SWITCH DEFUN IS T, THEN THE EXPR-HASH HACK IS ENABLED. IN THIS CASE, DEFUN AVOIDS MAKING THE INTERPRETIVE DEFINITION IF HASHING THE DEFINITION INDICATES THAT IT IS THE SAME AS THE CURRENT, PRESUMABLY COMPILED, DEFINITION. THE VARIOUS CASES ARE: FORM OF : FOO (FOO BAR) (FOO BAR BAZ) (FOO BAR BAZ QUUX) EXPR-HASH PROPERTY IS ON THE ATOM: FOO THE RESULT OF - NONE - FOO (GET 'FOO 'BAR) IF THIS IS A SYMBOL EXPR-HASH PROPERTY INDICATOR IS: EXPR-HASH EXPR-HASH - NONE - QUUX DEFUN PUTS THE FUNCTION DEFINITION ON FOO UNDER THE PROPERTY: EXPR/FEXPR/MACRO BAR BAR BAR COMPILER PUTS THE FUNCTION DEFINITION ON FOO UNDER THE PROPERTY: SUBR/FSUBR/LSUBR BAR * BAZ BAZ * THE PROPERTY WILL BE A SYMBOL |FOO BAR| WHICH IN TURN WILL HAVE THE APPROPRIATE SUBR/FSUBR/LSUBR PROPERTY. [2] (STATUS JNUMBER) RETURNS THE NUMBER OF THE LISP JOB (AS DEFINED BY THE HOST OPERATING SYSTEM). [3] THE EDITOR COMMAND YV FOO IS THE SAME AS YP FOO VALUE . IT IS USEFUL FOR EDITING THE VALUE OF A SYMBOL. [A] T AND NIL AS THE SECOND ARGUMENT TO FILEPOS HAVE SPECIAL MEANINGS. T MEANS THE END OF THE FILE, AND NIL MEANS THE ACTUAL BEGINNING OF THE FILE. THE DIFFERENCE BETWEEN NIL AND 0 IS THAT 0 MEANS THE LOGICAL BEGINNING OF THE FILE, WHILE NIL MEANS THE PHYSICAL BEGINNING. THIS MAKES NO DIFFERENCE IN ANY CURRENT IMPLEMENTATION, BUT WILL MAKE A DIFFERENCE WHEN SAIL NEWIO EXISTS. FILEPOS WILL KNOW ABOUT THE SAIL RECORD OFFSET FEATURE, AND NIL WILL MEAN THE APPROPRIATE NEGATIVE RECORD NUMBER. [B] THERE ARE THREE KINDS OF CONTEXTS IN WHICH A FILE OBJECT CAN BE USED: (1) AN INPUT FILE IS NEEDED, E.G. FOR READ AND TYI. (2) AN OUTPUT FILE IS NEEDED, E.G. FOR PRINT AND TYO. (3) EITHER DIRECTION IS ACCEPTABLE, E.G. FOR LINEL AND (STATUS TTYCONS). IN THE PAST T HAS MEANT THE TTY (THE TERMINAL). UNFORTUNATELY, THERE IS AN AMBIGUITY IN CONTEXT (3). TO ALLEVIATE THIS, WE ARRANGED FOR THE VARIABLES TYI AND TYO TO CONTAIN THE FILES USED FOR THE TTY (AS ALREADY DOCUMENTED), SO THAT THE USER CAN REFER TO THESE VARIABLES IN CONTEXT (3). MOREOVER, IN CONTEXTS (1) AND (2) T IS TAKEN TO MEAN "THE FILE IN THE VARIABLE TYI OR TYO (RESPECTIVELY)". A PREVIOUSLY UNDOCUMENTED FEATURE OF THIS IS THAT MSGFILES, FOR EXAMPLE, CAN BE '(T) (WHICH IS IN FACT THE DEFAULT VALUE), WHICH CAUSES MESSAGES TO GO TO WHATEVER FILE IS IN TYO. IN THIS WAY ONE NEED NOT CHANGE MSGFILES JUST BECAUSE THE VALUE OF TYO IS CHANGED. WE NOW ALSO MAKE THE FURTHER EXTENSION THAT IN CONTEXT (2), WHERE ^W WOULD BE HEEDED IF A FILE ARGUMENT WERE OMITTED, THAT SPECIFYING THE FILE EXPLICITLY (BY REFERRING TO THE VALUE OF TYO) WILL NOT HEED ^W, BUT SPECIFYING T WILL ALLOW ^W TO FORCE THE FILE IN TYO TO BE IGNORED. THIS, FOR EXAMPLE, ALLOWS ^W TO SUPPRESS MSGFILES ACTIVITY TO THE TTY AND WELL AS ORDINARY ACTIVITY. NIL AS A FILE MEANS DIFFERENT THINGS IN DIFFERENT CONTEXTS. IN CONTEXTS (1) AND (2) IT MEANS THE SAME AS SPECIFYING NO FILE ARGUMENT AT ALL, AND SO USES THE DEFAULT (INFILE FOR CONTEXT (1), OUTFILES AND TYO AS CONTROLLED BY ^R AND ^W FOR CONTEXT (2)). FOR CONTEXT (3) IT MEANS "SET A DEFAULT VALUE" IF THAT IS APPROPRIATE (E.G. FOR LINEL), AND IS ILLEGAL IF NOT APPROPRIATE. [C] IF MSGFILES IS EVER FOUND TO HAVE A BAD VALUE, AND IO-LOSSAGE ERROR OCCURS, SIMILAR TO THE FAIL-ACT ERRORS FOR BAD VALUES OF BASE, IBASE, ETC. BEFORE THE ERROR OCCURS, MSGFILES IS SET TO '(T). [D] UREAD AND UFILE NOW HAVE AS THEIR VALUE A FULL NAMELIST, NOT JUST THE SIMPLE FILE NAMES. THUS UREAD MIGHT RETURN ((DSK LOSER) FOO BAR) WHERE FORMERLY IT WOULD HAVE RETURNED (FOO BAR). [E] UAPPEND NO LONGER RENAMES THE OPENED FILE TO ".LISP. APPEND"; THE FILE RETAINS ITS OWN NAME. (THIS IS PRIMARILY BECAUSE IT IS SO DIFFICULT TO RENAME AN OPEN FILE ON TOPS-10 - GRR!). [F] HERE ARE THE OFFICIAL DEFINITIONS OF THE OLDIO FUNCTIONS IN TERMS OF NEWIO FUNCTIONS: (DEFUN UREAD FEXPR (FILENAME) (UCLOSE) ((LAMBDA (FILE) (EOFFN UREAD (FUNCTION (LAMBDA (EOFFILE EOFVAL) (UCLOSE) EOFVAL))) (INPUSH (SETQ UREAD FILE)) (DEFAULTF FILE)) (OPEN (*UGREAT FILENAME) 'IN))) (DEFUN UCLOSE FEXPR (X) (COND (UREAD ((LAMBDA (OUREAD) (AND (EQ OUREAD INFILE) (INPUSH -1)) (SETQ UREAD NIL) (CLOSE OUREAD)) UREAD)) (T NIL))) (DEFUN UWRITE FEXPR (DEVDIR) (OR DEVDIR (SETQ DEVDIR (CAR (DEFAULTF NIL)))) (*UWRITE (CONS DEVDIR (COND ((STATUS FEATURE DEC10) (CONS (STATUS JNAME) '(OUT))) ((STATUS FEATURE DEC20) '(MACLISP OUTPUT)) ((STATUS FEATURE ITS) '(.LISP. OUTPUT)))) 'OUT (LIST DEVDIR))) (DEFUN UAPPEND FEXPR (FILENAME) (SETQ FILENAME (*UGREAT FILENAME)) (*UWRITE FILENAME 'APPEND FILENAME)) (DEFUN *UWRITE (NAME MODE NEWDEFAULT) ;INTERNAL ROUTINE (COND (UWRITE (SETQ OUTFILES (DELQ UWRITE OUTFILES)) (CLOSE UWRITE) (SETQ UWRITE NIL))) ((LAMBDA (FILE) (SETQ OUTFILES (CONS (SETQ UWRITE FILE) OUTFILES)) (CAR (DEFAULTF NEWDEFAULT))) (OPEN NAME MODE))) (DEFUN UFILE FEXPR (SHORTNAME) (COND ((NULL UWRITE) (ERROR 'NO/ UWRITE/ FILE (CONS 'UFILE SHORTNAME) 'IO-LOSSAGE)) (T (PROG2 NIL (DEFAULTF (RENAMEF UWRITE (*UGREAT SHORTNAME))) (SETQ OUTFILES (DELQ UWRITE OUTFILES)) (SETQ UWRITE NIL) (OR OUTFILES (SETQ ^R NIL)))))) (DEFUN *UGREAT (NAME) ;INTERNAL ROUTINE (MERGEF NAME (COND ((STATUS FEATURE DEC10) '(* . LSP)) ((STATUS FEATURE DEC20) '(* MACLISP *)) ((STATUS FEATURE ITS) '(* . >))))) (DEFUN UPROBE FEXPR (FILENAME) (SETQ FILENAME (MERGEF (*UGREAT FILENAME) NIL)) (PROBEF FILENAME)) (DEFUN UKILL FEXPR (FILENAME) (DEFAULTF (DELETEF FILENAME)))) [G] FOR CONSISTENCY WITH TOPS-10 (SIGH), THE NEWIO FUNCTIONS DELETEF AND RENAMEF WHEN APPLIED TO A FILE OBJECT WILL ALSO CLOSE THE FILE OBJECT. [H] IN CASE ANYONE CARES, ALL ITS NEWIO I/O TRANSACTIONS ARE NOW DONE WITH SIOT, NOT WITH BLOCK IOT. THIS MAY AFFECT INTERACTIONS WITH FILES WRITTEN BY PROGRAMS WHICH STILL USE BLOCK IOT (E.G. ^C PADDING AT ENDS OF FILES). THE FOLLOWING FEATURES EXIST ONLY IN THE SAIL VERSION. EVENTUALLY THEY WILL BE IMPLEMENTED IN ALL DEC-10 VERSIONS. SOME OF THESE PROVIDE ABILITIES ANALOGOUS TO, BUT NOT IDENTICAL WITH, FEATURES ALREADY PROVIDED ON ITS FOR HACKING SHARABLE CODE AND DATA. SYSTEMS PROGRAMMERS SHOULD EXAMINE THE FOLLOWING DESCRIPTIONS TO SEE HOW TO HANDLE THESE FEATURES IN A MANNER COMPATIBLE WITH ALL VERSIONS. AT THE END IS AN EXAMPLE OF HOW TO CREATE A SHARED SYSTEM IN A WAY THAT WILL WORK IN ALL EXISTING PDP-10 VERSIONS. [!] THE SAIL (SU-AI) TIME-SHARING SYSTEM ORDINARY SAVES TWO-SEGMENT PROGRAMS AS A SINGLE FILE, UNLIKE TOPS-10, WHICH USES TWO DISTINCT DISK FILES (ONE FOR EACH SEGMENT). MACLISP NOW GOES TO SOME TROUBLE TO USE TWO DISTINCT FILES ON SAIL ALSO. THE HIGH-SEGMENT FILE NORMALLY HAS THE EXTENSION ".SHR". THIS IS USED TO SUPPORT THE OTHER FEATURES BELOW. ["] WHEN A NEW MACLISP HAS BEEN ASSEMBLED, LOADED, AND STARTED BY THE SU-AI MAINTAINER, IT WILL AUTOMATICALLY TRY TO DUMP OUT THE HIGH SEGMENT AS A DISK FILE, AND WILL PRINT A MESSAGE REGARDING SUCCESS OR FAILURE. IT THEN LOADS THE LINE EDITOR WITH AN APPROPRIATE SAVE COMMAND (NOT SSAVE, BECAUSE ONLY THE LOW SEGMENT SHOULD BE SAVED) FOR THE USER TO APPROVE WITH "RETURN" IF DESIRED. (IF THE MAINTAINER WANTS TO USE NON-STANDARD FILE NAMES, HE CAN DEPOSIT THE NAMES IN LOCATIONS SGADEV, SGANAM, SGAEXT, AND SGAPPN.) [#] FASLOAD CAN NOW LOAD CODE INTO THE HIGH SEGMENT. RECALL THAT IN THE ITS VERSION, THE VARIABLE "PURE" CONTROLS THE LOADING OF PURIFIABLE (SHARABLE) CODE. THE MEANING OF THIS VARIABLE HAS BEEN EXTENDED. IF PURE IS A FIXNUM, THEN FASLOAD WILL SET UP FOR THE UUOLINKS HACK. THE EXTENSION IS TWOFOLD: (1) IF THE ABSOLUTE VALUE OF PURE IS LESS THAN 10, IT IS MULTIPLIED BY 1024. (1K). (2) THE ABSOLUTE VALUE OF THE RESULT IS AN ESTIMATE OF THE NUMBER OF *WORDS* DESIRED FOR THE UUOLINKS HACK. THIS SHOULD BE ABOUT 15% MORE THAN THE TOTAL NUMBER OF DIFFERENT COMPILED FUNCTIONS TO BE LOADED. (STEP 1 IS FOR COMPATIBILITY WITH THE OLD MEANING OF PURE, AS THE NUMBER OF 1K BLOCKS TO RESERVE.) IN THE ITS (AND DEC-20) VERSIONS, THE SIGN OF THE FIXNUM IS IRRELEVANT. FOR SAIL (AND EVENTUALLY TOPS-10 AND CMU), THE SIGN CONTROLS WHICH SEGMENT TO LOAD INTO. A POSITIVE VALUE LOADS INTO THE LOW SEGMENT, AS BEFORE. A NEGATIVE VALUE CAUSES THE HIGH SEGMENT TO BE DEPURIFIED (A WRITABLE COPY MADE) IF NECESSARY; THE CODE IS THEN LOADED INTO THE HIGH SEGMENT. ALSO, ONLY ONE OF THE UUOLINKS AREAS IS MADE IN THE LOW SEGMENT; THE OTHER IS PUT IN THE HIGH SEGMENT. (THUS THE HIGH-SEGMENT LOADING FEATURE IS TIED TO THE UUOLINKS FEATURE - SORRY ABOUT THAT.) [$] RECALL THAT *PURE CONTROLS WHETHER CERTAIN KINDS OF S-EXPRESSIONS ARE TO BE AUTOMATICALLY PURCOPY'D. FOR ITS (AND DEC-20) ALL THAT MATTERS IS WHETHER IT IS NIL OR NON-NIL. FOR SAIL (AND EVENTUALLY TOPS-10 AND CMU), IT MUST BE A FIXNUM TO CAUSE PURCOPY TO USE THE HIGH SEGMENT. THIS IN TURN WORKS ONLY IF PURE IS A NEGATIVE FIXNUM. THE VALUE OF *PURE SHOULD BE AN ESTIMATE OF THE TOTAL NUMBER OF WORDS OF PURE FREE STORAGE NEEDED, INCLUDING ALL THAT LOADED BY PREVIOUS FILES AND ALL THAT INCLUDED IN THE INITIAL LISP SYSTEM (PRESENTLY ABOUT 6000. WORDS). THIS CAUSES FASLOAD TO PREALLOCATE ENOUGH ADDITIONAL ROOM IN THE HIGH SEGMENT TO ACCOMODATE THE ESTIMATED TOTAL AMOUNT OF PURE STORAGE. (THE PREALLOCATION IS NECESSARY BECAUSE IT ISN'T POSSIBLE TO ALLOCATE LIST STORAGE IN THE HIGH SEGMENT ONCE THE LOADING OF CODE HAS BEGUN.) MAKING THE ESTIMATE IN *PURE TOO BIG MERELY WASTES SPACE IN THE HIGH SEGMENT; MAKING IT TOO SMALL CAUSES PURCOPY TO MAKE ITS COPIES IN THE LOW SEGMENT. [%] ONCE CODE AND DATA HAS BEEN LOADED INTO THE HIGH SEGMENT, ONE CAN USE SUSPEND TO REPURIFY AND DUMP IT. IF SUSPEND IS GIVEN TWO ARGUMENTS, IT WILL TAKE THE SECOND AS A FILE NAME, DUMP THE HIGH SEGMENT TO THAT FILE, AND EXPUNGE THE HIGH SEGMENT. IT THEN RETURNS TO MONITOR LEVEL. (THE SAIL VERSION ALSO LOADS THE FIRST ARGUMENT INTO THE LINE EDITOR; THIS WILL NORMALLY BE A SAVE (NOT SSAVE) COMMAND.) WHEN THE LOW SEGMENT IS SUBSEQUENTLY CONTINUED OR RUN FROM THE SAVE FILE, IT WILL ATTACH TO A HIGH SEGMENT MADE FROM THE SAVED HIGH-SEGMENT FILE. IN SO DOING IT WILL ARRANGE TO SHARE THAT HIGH SEGMENT WITH OTHER LISPS USING THAT SAME HIGH SEGMENT. CHANGES OF INTEREST TO LISP SYSTEM HACKERS: [{] THERE WAS A BUG WHICH OCCURRED BECAUSE CONS (AND HUNK) DID NOT PDLNMK ITS ARGUMENTS. THIS WAS CONSIDERED OKAY BECAUSE NCOMPLR KNOWS ABOUT THESE SPECIALLY, AND KNOWS THAT THEY MUST NOT BE GIVEN UNSAFE ARGUMENTS. HOWEVER, IT WAS POSSIBLE TO USE FUNCALL (OR SUBRCALL!) TO GIVE THEM UNSAFE ARGUMENTS. THE SOLUTION WAS TO MAKE CONS AND HUNK ALWAYS PDLNMK, AND TO HAVE SPECIAL ROUTINES %CONS, %NCONS, %XCONS, %HUNK3, AND %HUNK4, WHICH ARE CALLED BY JSP T, AND WHICH NCOMPLR KNOWS ABOUT. THESE EXPECT SAFE ARGUMENTS AND DO NOT PDLNMK. [|] INITG IS NOW INITIALIZEG, TO PREVENT CONFLICT WITH DEC-10 INIT UUO. [}] THE MACRO PUSHN PDL,N PUSHES N WORDS OF ZEROS ONTO PDL. THIS WORKS FOR ANY N; THE MACRO KNOWS ABOUT THE ROUTINES NPUSH, 0PUSH, AND 0.0PUSH AND GENERATES THE APPROPRIATE CALLS. THE MACRO IMPLICITLY DESTROYS T. THE MACRO POPI PDL,N POPS N WORDS FROM PDL BY SUBTRACTING AN APPROPRIATE LITERAL. THE MACRO KNOWS ABOUT LOCATION R70. [~] THE FORMAT OF FILE OBJECTS HAS BEEN CHANGED TO ACCOMODATE NEW INFORMATION. SOME EXTRA RESERVED SLOTS HAVE BEEN CREATED FOR FUTURE EXPANSION. IN PARTICULAR, NOTICE J.UIND (USER INDEX) FOR JOB ARRAYS, AND FB.BVC (VALID CHARACTER COUNT) FOR FILE OBJECTS. THURSDAY JUNE 09,1977 LQ+1D.1H.47M.35S. LISP 293 - GLS - [1] EVALHOOK NEVER SEES THE ARRAY REFERENCE OF A STORE [A] THE DEFAULT ##MORE## PROCESSOR NOW DOES (NOINTERRUPT NIL) [B] CHANGES TO ALLFILES: [B1] NAMESTRINGS ARE NOW ILLEGAL - USE NAMELISTS OR FILES [B2] NEW OPTIONS: BITS, CHARACTERS, BYTES, BYTESIZE ---------------------------------------------------------------- [1] TO PREVENT A PECULIAR SCREW INVOLVING THE PARTICULARLY KLUDGY IMPLEMENTATION OF STORE, THE EVALHOOK FUNCTION (IF ANY) WILL NEVER SEE THE ARRAY REFERENCE ITSELF AS A HOOKED FORM. INSTEAD, IT WILL SEE ONLY SUBFORMS OF THE ARRAY REFERENCE. [A] MY FACE IS RED. TIME AND AGAIN I HAVE WARNED THAT ASYNCHRONOUS INTERRUPTS ARE ALWAYS RUN BY THE SYSTEM IN (NOINTERRUPT T) MODE TO PREVENT TIMING BUGS. IT IS UP TO THE INTERRUPT FUNCTION TO RE-ENABLE INTERRUPTS BY SAYING (NOINTERRUPT NIL) IF DESIRED. THE SYSTEM-SUPPLIED ##MORE## PROCESSOR NOW DOES (NOINTERRUPT NIL) SO THAT IF YOU TYPE ^G (QUIT) OR ANY OTHER INTERRUPT CHARACTER AT IT THE INTERRUPT WILL GO THROUGH IMMEDIATELY. [B] CHANGES TO THE ALLFILES PACKAGE, WHICH INCLUDES THE FUNCTIONS ALLFILES, MAPALLFILES, DIRECTORY, AND MAPDIRECTORY: [B1] TO PREVENT A REOCCURRENCE OF THE RECENT DISASTER IN WHICH SOMEONE DID (MAPALLFILES 'DELETEF '((DSK LOSER) * *)) AND DELETED 1/3 OF ALL OF MC'S FILES BEFORE IT WAS STOPPED, ALLFILES AND RELATED FUNCTIONS WILL NOT ACCEPT NAMESTRINGS ANY MORE. (RRECALL THAT THE FILESPEC ARGUMENT IS A LIST OF FILESPECS; THE TRAP IS THAT ERRONEOUSLY FEEDING IT A SINGLE NAMELIST WILL MAKE IT THINK IT IS GETTING A LIST OF NAMESTRINGS.) NAMELISTS AND FILE OBJECTS ARE STILL ACCEPTABLE. IF YOU REALLY WANT TO ALLOW NAMESTRINGS, YOU CAN ALWAYS SAY (ALLFILES (MAPCAR 'NAMELIST FOO) ...) AND BE VERY, VERY, VERY, VERY, VERY, VERY CAREFUL! [B2] NEW OPTIONS ACCEPTED BY THE DIRECTORY AND MAPDIRECTORY FUNCTIONS: BITS THE NUMBER OF BITS IN THE FILE BYTES THE NUMBER OF BYTES IN THE FILE BYTESIZE THE SIZE OF THE BYTES CHARACTERS THE NUMBER OF CHARACTERS IN THE FILE (THIS IS AN OLD OPTION, BUT NOW IT YIELDS THE CORRECT CHARACTER COUNT RATHER THAN ROUNDING UP TO A MULTIPLE OF FIVE) MONDAY MAY 16,1977 LQ+6D.8H.0M.26S. LISP 1272 - GLS - I BELIEVE THAT I HAVE FINALLY KILLED THE GC BUG THAT WAS CAUSING THE TOPS-10 IMPLEMENTATION TO GET MPV ON STARTUP. NUMEROUS OTHER BUGS HAVE BEEN KILLED ALSO. AS ALWAYS, NUMBERED ITEMS ARE FOR ALL LISPS, AND LETTERED ONES FOR NEWIO ONLY. THE OTHERS ARE IN NON-STANDARD CATEGORIES. [1] THE VALUE OF HUNKP CONTROLS PRINT, PURCOPY, AND EQUAL [2] PURE HUNKS EXIST (PURCOPY WILL WIN ON HUNKS) [3] NEW PREDICATE: SYMBOLP [4] CHANGES TO RANDOM; ALSO ([S]STATUS RANDOM). [5] WARNING ABOUT MOST NEGATIVE NUMBER (THE "SETZ" PROBLEM) [6] +, +$, AND THE LIKE NEVER DETECT OVERFLOW OR UNDERFLOW [7] FLONUM OUTPUT HAS BEEN IMPROVED [8] SQRT HAS BEEN IMPROVED [9] VALUE OF FASLOAD IS NOW THE FUNCTION PROPERTIES TO CHECK [A] NEW FUNCTION: FILEP [B] FOR INFERIOR JOB HACKERS: JOBS CAN HAVE "PROPERTY LISTS" [C] ASCII MODE I/O TO AND FROM INFERIORS IS PRESENTLY BROKEN [&] THE NEW FUNCTION LH| PERFORMS A COMPLETELY WEIRD CROCK FOR LH [;] THE SEGMENT TABLE BITS $FXP AND $FLP HAVE BEEN CHANGED ---------------------------------------------------------------- [1] THE VARIABLE HUNKP (INITIALLY T), IF NIL, CAUSES THE FUNCTIONS PRINT, EQUAL, AND PURCOPY TO TREAT HUNKS AS LISTS (AS MOST OTHER SYSTEM FUNCTIONS DO). IF NON-NIL, THEN THESE THREE FUNCTIONS WILL TREAT THE HUNNKS AS HUNKS; IN PARTICULAR, EQUAL WILL COMPARE THE HUNKS ELEMENT-BY-ELEMENT. [2] PURE HUNKS EXIST (PURCOPY WILL WIN ON HUNKS). THIS JUST FILLS IN A TRIVIAL HOLE THAT I DIDN'T GET AROUND TO IMPLEMENTING EARLIER. (STATUS PURSPCNAMES) WILL REFLECT THE PRESENCE OF THIS FEATURE. [3] (SYMBOLP X) IS NON-NIL IFF X IS AN ATOMIC SYMBOL. THIS CATEGORY INCLUDES NIL; THAT IS, (SYMBOLP 'NIL) => T. [4] THE RANDOM FUNCTION NOW HAS BETTER BEHAVIOR. THE TWO-ARGUMENT FORM HAS BEEN ELIMINATED (WHICH USED TO INITIALIZE THE GENERATOR), SINCE THE STATE CANNOT BE CONTAINED IN TWO FIXNUMS ANY MORE. A NEW STATUS FUNCTION EXISTS FOR THIS PURPOSE. (STATUS RANDOM) RETURNS A LIST WHICH SUMMARIZES THE STATE OF THE RANDOM NUMBER GENERATOR. NO GUARANTEES ARE MADE AS TO ITS FORMAT, EXCEPT THAT IT MAY BE FED AS AN ARGUMENT X TO (SSTATUS RANDOM X), WHICH WILL RESTORE THE GENERATOR TO THAT FROZEN STATE. (SSTATUS RANDOM N) FOR ANY FIXNUM N IS ALSO PERMISSIBLE; THIS WILL INITIALIZE THE GENERATOR IN A WAY THAT DEPENDS IN AN UNSPECIFIED WAY ON N. (THIS IS SO THAT PEOPLE CAN DO, FOR EXAMPLE, (SSTATUS RANDOM (TIME)) OR SOMETHING.) [5] THE PDP-10 HARDWARE (BOTH KA10 AND KL10) HAS A WEIRD GLITCH TO THE EFFECT THAT IT FAILS TO DIVIDE THE MOST NEGATIVE FIXNUM (-400000000000) BY 1 CORRECTLY, EVEN THOUGH THE RESULTS ARE WELL-DEFINED AND REPRESENTABLE. THE GENERIC FUNCTIONS (QUOTIENT, *QUO, REMAINDER) HAVE BEEN FIXED TO COMPENSATE FOR THIS PROBLEM; THEY ARE CONCEPTUALLY "GUARANTEED" TO RETURN CORRECT ANSWERS INDEPENDENT OF SUCH HARDWARE LOSSES. HOWEVER, THERE IS NO EFFECTIVE WAY TO FIX THE FIXNUM-ONLY FUNCTIONS (//, \); SUCH FUNCTIONS ARE PERMITTED TO HAVE THE CHARACTERISTICS IMPOSED BY THE HOST HARDWARE (THUS ON MULTICS // MAY HAVE OTHER PECULIARITIES, FOR ALL I KNOW). THIS IS BECAUSE THESE FUNCTIONS ARE INTENDED TO BE OPEN-CODED AS SINGLE HOST HARDWARE INSTRUCTIONS. BEWARE! [6] THE FIXNUM- AND FLONUM-ONLY ARITHMETIC FUNCTIONS ARE NOW *DEFINED* TO DO "WHAT THE HARDWARE DOES". THE INTERPRETED VERSIONS USED TO DETECT OVERFLOW AND UNDERFLOW, BUT NO MORE. THUS YOU CAN USE + TO COMPUTE STRANGE CHECKSUMS, ETC. IN ANY CASE, COMPILED AND INTERPRETED CODE SHOULD BE COMPATIBLE WITH RESPECT TO THESE FUNCTIONS. ANY PECULIAR SCREWS IN THE HARDWARE ARE NOT COMPENSATED FOR (SEE [5] ABOVE). THE GENERIC ARITHMETIC FUNCTIONS ARE "GUARANTEED" TO BEHAVE "MATHEMATICALLY" AND TO COMPENSATE AS NECESSARY FOR SUCH SCREWS. [7] AN IMPROVED FLONUM PRINT ALGORITHM HAS BEEN INSTALLED. I (GLS) HAVE "PROVED" THAT IT HAS THESE PROPERTIES: (1) IT OUTPUTS ENOUGH DIGITS THAT NO INFORMATION IS LOST (A PERFECT READER, WHICH I DO NOT YET CLAIM LISP HAS, CAN ALWAYS RECOVER THE ORIGINAL FLONUM BY ROUNDING). (2) IT OUTPUTS NO MORE DIGITS THAN NECESSARY TO ACHIEVE (1). (3) IT OUTPUTS THE BEST POSSIBLE DECIMAL FLONUM OF THE NUMBER OF DIGITS IN (2). [8] THANKS TO AN ALGORITHM FROM KAHAN AND HELP FROM RJF (FATEMAN), THE SQRT ROUTINE HAS BEEN IMPROVED. IT IS CONSIDERABLY FASTER. [9] THE VALUE OF FASLOAD IS NOW THE LIST OF PROPERTIES FASLOAD SHOULD CHECK FOR TO DECIDE WHETHER TO PRINT A WARNING MESSAGE. ITS INITIAL VALUE IS (SUBR FSUBR LSUBR), AND SO WILL HAVE THE SAME EFFECT AS BEFORE, WHEN THE INITIAL VALUE WAS T. ALSO AS BEFORE, SETTING FASLOAD TO NIL WILL SUPPRESS ALL SUCH ERROR MESSAGES. ONE CAN BE VERY PARANOID, FOR EXAMPLE, AND SET IT TO (EXPR SUBR LSRUB FEXPR FSUBR ARRAY MACRO). [A] THE PREDICATE FILEP RETURNS T IFF ITS ARGUMENT IS A FILE OBJECT. IT WILL RETURN T EVEN IF IT IS A CLOSED FILE; TO DETECT AN OPEN FILE, USE (AND (FILEP X) (STATUS FILEMODE X)). [B] INFERIOR JOB OBJECTS NOW HAVE AN EXTRA SLOT J.CRUFT WHICH IS GC-PROTECTED. SEE SYS:.FASL DEFS FOR THE JOB OBJECT DEFINITIONS. BY CONVENTION, THIS NEW SLOT IS USED TO HOLD A PROPERTY LIST FOR VARIOUS DATA ABOUT THE JOB. [C] BECAUSE OF AN ITS DEFICIENCY, THE NEW CODE THAT ALLOWS FILEPOS TO WORK ON OUTPUT FILES AND SIOT TO BE USED FOR ALL ASCII I/O DOESN'T WORK ON THE USR DEVICE (INFERIOR JOBS). THE BASIC PROBLEM IS THAT SIOT DOESN'T WORK ON THE USR DEVICE IN ITS. ONE CONSEQUENCE IS THAT LISPT WILL NOT WORK ON ITS 1051 AND ABOVE (FOR WHICH THE NEW SIOT I/O CODE WILL BE PROVIDED IN LISP). [&] THE FUNCTION LH| IS A HACK FOR THE BENEFIT OF THIRD-FLOOR HACKERS. IT NORMALLY EXISTS ONLY IN THE ITS VERSION. THIS FEATURE IS ONLY SEMI-OFFICIAL, AND I WON'T GUARANTEE IT TO WORK FOR ANYONE BUT LH AND FRIENDS. (LH| ) ALLOCATES A CHUNK OF MEMORY WORDS BIG OF DATA TYPE . (ACTUALLY, IS ROUNDED UP TO BE AN INTEGRAL NUMBER OF PAGES.) THE RETURNED VALUE IS A FIXNUM WHICH IS THE ADDRESS OF THE FIRST WORD OF THE CHUNK OF MEMORY. IF ZERO IS RETURNED, IT WAS NOT POSSIBLE TO OBTAIN THE MEMORY. (THIS SHOULD BE FAMILIAR TO GETCOR HACKERS!) ONE SHOULD **NOT** USE (DECLARE (FIXNUM (LH/|))); IT IS NOT A NUMBER FUNCTION JUST BECAUSE IT RETURNS A FIXNUM! NOTICE THAT ONE MUST USE A "/" TO GET THE "|" IN THE NAME OF THE FUNCTION. THE CHUNK OF MEMORY WILL BE MADE TO HAVE THE DATA TYPE INDICATED BY ; ONE CAN ALLOCATE THE MEMORY AT WILL AND CREATE POINTERS INTO IT. GC WILL MARK FROM ALL WORDS IN THE SPACE IF IS LIST, BIGNUM, OR ANY KIND OF HUNK. HOWEVER, THE DATA IN THE MEMORY ITSELF IS NOT MARKED OR SWEPT. NO GUARANTEES ARE MADE IF IS "SYMBOL" OR "ARRAY"; ALL OTHER DATA TYPES SHOULD WORK, HOWEVER. [;] FOR ANY .FASL CODE HACKERS WHO MAY CARE: THE BITS $FXP AND $FLP IN SEGMENT TABLE ENRTIES HAVE DISAPPEARED. THE BIT THAT USED TO BE $FXP IS NOW CALLED $PDLNM, AND $FLP IS NO LONGER USED. PDL NUMBER SEGMENTS NOW HAVE FX+$PDLNM OR FL+$PDLNM SET INSTEAD OF $FXP OR $FLP. (THIS IS TO ALLOW INTRODUCTION OF OTHER NUMBER PDLS IN THE FUTURE IF DESIRED.) THIS CHANGE IS UPWARD-COMPATIBLE FOR COMPILED CODE WHICH OPEN-CODES TYPE TESTS; EVENTUALLY THE COMPILER WILL BE CHANGED TO REFLECT THE NEW BITS. THURSDAY MARCH 03,1977 FQ+6D.12H.27M.23S. LISP 1258 - GLS - WELL, WE ARE WORKING AWAY ON THE NEW LISP MANUAL! ELLEN IS DOING MOST OF THE WORK, WITH OTHERS PITCHING IN WRITING NEW TEXT (THE CONFLICTS BETWEEN WHICH ELLEN GETS TO RESOLVE). CURRENTLY CHAPTERS 3 AND 4 ARE IN PROGRESS. THE FILES ".INFO.;OLDIO ORDER" AND ".INFO.;NEWIO ORDER" CONTAIN A SUMMARY OF THE FUNCTIONS AND VARIABLES AVAILABLE IN LISP. I WILL TRY TO KEEP THESE UP-TO-DATE (THEY ARE MECHANICALLY GENERATED). THE FOLLOWING NAMING SCHEME TAKES EFFECT ON ITS AS OF THIS VERSION. -> MEANS "IS LINKED TO" (DISK-TYPE FILE NAME LINKS). L -> LISP -> NEWIO Q -> NEWIO -> SYS:PURQIO > O -> OLDIO -> SYS:PURBIB > OL -> OLISP -> ONEWIO OQ -> ONEWIO -> SYS:PURQIO NNN (FOR SOME NNN) OO -> OOLDIO -> SYS:PURBIB NNN (FOR SOME NNN) OOL -> OOLISP -> OONEWIO OOQ -> OONEWIO -> SYS:PURQIO < OOO -> OOOLDIO -> SYS:PURBIB < THAT IS, L^K AND LISP^K NOW ALWAYS GET YOU A NEWIO. SO DO Q^K AND NEWIO^K. TO GET AN OLDIO, USE O^K OR OLDIO^K. THE "O" AND "OO" VERSIONS GET OLD AND VERY OLD VERSIONS. THIS WAS ALREADY IN EFFECT ON AI, BUT IS NOW ON ALL ITS MACHINES. MANY BUGS HAVE BEEN FIXED IN THIS VERSION, INCLUDING THE ONE ABOUT GC-OVERFLOW (I HOPE!). MANY NEW FEATURES AS FOLLOWS. AS ALWAYS, NUMBERED ITEMS ARE FOR ALL LISPS, AND LETTERED ITEMS FOR NEWIO ONLY. [1] NEW FUNCTION: QUIT (COMPATIBLE WITH MULTICS VERSION) [2] CHANGES TO GC-RELATED USER INTERRUPTS: [2A] GC-OVERFLOW WORKS BETTER - CAN GET SEVERAL PER GC [2B] GC-DAEMON GETS MORE INFORMATION NOWADAYS [3] CHANGES TO STATUS FUNCTIONS: [3A] (STATUS PURSPCNAMES) YIELDS NAMES OF ALL PURE SPACES [3B] (STATUS HACTRN) YIELDS T FOR UNKNOWN SUPERIOR [3C] (STATUS XJNAME) HAS BEEN RENAMED (STATUS SUBSYSTEM) [3D] (STATUS XUNAME) HAS BEEN RENAMED (STATUS USERID) [3E] (STATUS FEATURE TOPS-10) IS BEST WAY TO CHECK FOR TOPS-10 [3F] WE ARE PHASING OUT (STATUS TERPRI) - USE TERPRI VARIABLE [A] FILEPOS WORKS ON OUTPUT FILES - ALL ITS I/O USES SIOT NOW [B] INCLUDE PROVIDES AN EOFFN TO MAKE EOF TRANSPARENT [C] AUTOLOAD NOW USES LOAD INSTEAD OF FASLOAD (LIKE MULTICS) [D] DELETEF OF AN OPEN FILE NOW USES DELEWO (IT USED TO JUST LOSE) [E] THE RENAME FUNCTION HAS BEEN RENAMED TO RENAMEF [F] (STATUS TTYREAD) IS NOW IN THE READTABLE AGAIN IN NEWIO [G] NUMERIC (STATUS TTYINT) VALUES CAN NOW FILTER ALL SUPRA-ASCII BITS ---------------------------------------------------------------- [1] (QUIT), AS ON MULTICS, CAUSES THE LISP JOB TO COMMIT SUICIDE. (IT DOES NOT PRODUCE A ^G OR ^X QUIT - FOR THOSE, USE THE ^G FUNCTION OR (ERROR 'QUIT)!) QUIT IS ACTUALLY AN LSUBR OF 0 TO 1 ARGUMENTS. POSSIBLE VALUES FOR THE ARGUMENT: NIL SAME AS NO ARGUMENT - DO A NORMAL QUIT T QUIT AS NOISELESSLY AS POSSIBLE (DON'T PRINT :KILL, ETC.) ERROR ERROR QUIT. FLUSH TYPEAHEAD, AND GENERALLY CLEAN UP. A FIXNUM ARGUMENT IS MACHINE-DEPENDENT. ON ITS, IT IS FED AS THE EFFECTIVE ADDRESS FOR .BREAK 16,. [2] CHANGES TO GC-RELATED USER INTERRUPTS: [2A] IT USED TO BE THAT IF SEVERAL SPACES GOT A GC-OVERFLOW CONDITION DURING A SINGLE GC, ONLY ONE INTERRUPT WOULD BE SIGNALED. NOW ALL OF THEM SHOULD BE SIGNALLED, AS SEPARATE INTERRUPTS. [2B] THE ARGUMENT RECEIVED BY GC-DAEMON HAS BEEN CHANGED IN AN INCOMPATIBLE MANNER. THE OLD FORMAT WAS: ( ( . ) ...) THE NEW FORMAT IS: ( ( ) ...) THE TWO NEW QUANTITIES ARE THE SIZE OF THE SPACE AT THE BEGINNING AND END OF THE GC. THE DIFFERENCE OF THESE TWO QUANTITIES GIVES THE AMOUNT OF SPACE ADDED DURING THE GC, WHILE THE DIFFERENCE BETWEEN AND THE FROM THE PREVIOUS GC GIVES THE AMOUNT ADDED BETWEEN GC'S. NOTE ALSO THAT THE NEW FORMAT DOESN'T HAVE THAT CRETINOUS DOTTED PAIR, SO LATER MORE INFORMATION CAN BE ADDED COMPATIBLY. [3] CHANGES TO STATUS FUNCTIONS: [3A] (STATUS PURSPCNAMES) YIELDS NAMES OF ALL PURE SPACES. PRESENTLY THIS IS (LIST FIXNUM FLONUM BIGNUM), BUT IN CASE THIS EVER CHANGES, THIS STATUS CALL IS THE RIGHT WAY TO FIND THEM ALL. RECALL THAT (STATUS SPCNAMES) GIVES THE NAMES OF NON-PURE SPACES. [3B] (STATUS HACTRN) YIELDS T FOR UNKNOWN SUPERIOR. AS BEFORE, IT CAN ALSO YIELD "DDT" FOR A DDT SUPERIOR, "LISP" FOR A LISP SUPERIOR (THIS IS DETERMINED BY BITS IN THE .OPTION USER VARIABLE), OR NIL FOR NO SUPERIOR. [3C] (STATUS XJNAME) HAS BEEN RENAMED (STATUS SUBSYSTEM). EVENTUALLY THIS WILL BE MADE MEANINGFUL ON TOPS-10 AND MULTICS IMPLEMENTATIONS. THE INTENDED INTERPRETATION IS "THE GENERIC NAME OF THIS PROGRAM". (STATUS JNAME) IS TO BE INTERPRETED AS "THE UNIQUE IDENTIFIER OF THIS JOB WITHIN THE TIME-SHARING SYSTEM". [3D] (STATUS XUNAME) HAS BEEN RENAMED (STATUS USERID). EVENTUALLY THIS WILL BE MADE MEANINGFUL ON TOPS-10 AND MULTICS IMPLEMENTATIONS. THE INTENDED INTERPRETATION IS "THE GENERIC NAME OF THIS USER (E.G. "FRED"). (STATUS UNAME) IS TO BE INTERPRETED AS "THE UNIQUE IDENTIFIER OF THIS LOGGED-IN INSTANCE OF THE USER WITHIN THE TIME-SHARING SYSTEM". [3E] (STATUS FEATURE TOPS-10) IS BEST WAY TO CHECK FOR RUNNING UNDER A REAL TOPS-10 SYSTEM. WE MAY PHASE OUT (STATUS FEATURE DEC10), OR LET IT MEAN ANY TOPS-10-LIKE SYSTEM, SUCH AS SAIL. WE ALSO ANTICIPATE HAVING TO INTRODUCE (STATUS FEATURE TOPS-20) SOMEDAY. [3F] WE ARE PHASING OUT (STATUS TERPRI). PLEASE ELIMINATE FROM YOUR PROGRAMS IF POSSIBLE. IN NEWIO YOU CAN SET THE LINEL OF A FILE TO 0 INSTEAD, OR YOU CAN BIND THE TERPRI VARIABLE. [A] FILEPOS NOW WORKS ON OUTPUT FILES, THANKS TO IMPROVEMENTS TO ITS. THIS ONLY WORKS IN ITS VERSION 1048 OR GREATER, AND SO WILL NOT APPEAR ON A GIVEN MACHINE UNTIL A VERSION OF ITS APPEARS WHICH CAN SUPPORT THE FEATURE. AS A COROLLARY, ALL LISP BUFFERED I/O IS DONE WITH SIOT. IN THIS WAY EXACT CHARACTER COUNTS ARE USED, ELIMINATING THE TRAILING CONTROL-C PROBLEM. [B] INCLUDE PROVIDES AN EOFFN TO MAKE EOF TRANSPARENT. WHEN READING OFF THE END OF AN INCLUDED FILE, NO EOF SHOULD BE DETECTED (UNLESS READ WAS IN THE MIDDLE OF AN OBJECT, WHICH CAUSES A FAIL-ACT); READING SHOULD JUST CONTINUE IN THE FILE POPPED OFF THE INSTACK. THIS MEANS THAT AN INCLUDED FILE IS JUST LIKE STICKING THE INCLUDED FILE IN THE MIDDLE OF THE INCLUDING I/O STREAM. [C] AUTOLOAD NOW USES LOAD INSTEAD OF FASLOAD (LIKE MULTICS). [D] DELETEF OF AN OPEN FILE NOW USES DELEWO (IT USED TO JUST LOSE). THIS TOO DEPENDS ON ITS VERSION 1048 OR GREATER. [E] THE RENAME FUNCTION HAS BEEN RENAMED TO RENAMEF. THIS IS FOR COMPATIBILITY WITH DELETEF, MERGEF, PROBEF, ETC., AND TO AVOID USING UP A GOOD WORD. [F] (STATUS TTYREAD) IS NOW IN THE READTABLE AGAIN IN NEWIO. THIS IS COMPATIBLE WITH OLDIO, AND ALSO MAKES MORE SENSE SINCE IT IS RELATED TO THE FORCE-FEED BITS WHICH ARE ALSO IN THE READTABLE. SINCE IT NEVER WORKED BEFORE IN NEWIO ANYWAY, THIS SHOULD NOT BREAK ANY PROGRAMS! [G] RECALL THE FORMER OBSCURE FEATURE THAT IF AN "INTERRUPT FUNCTION" FOR THE KEYBOARD SET VIA (SSTATUS TTYINT) IS A FIXNUM, THEN IT SPECIFIES THE DEFAULT LISP ACTION FOR AN INTERRUPT CHARACTER OF THAT ASCII VALUE; AND THAT FURTHERMORE SUPRA-ASCII BITS COULD BE USED TO FILTER THE CONTROL AND META BITS, NAMELY 400 REQUIRED THE META BIT TO BE PRESENT FOR THE ACTION TO OCCUR, AND 400_22 FORBADE THE PRESENCE OF THE META BIT, AND SIMILARLY FOR 200 AND THE CONTROL BIT. THIS HAS BEEN EXTENDED TO THE TOP BIT (4000), THE SHIFT-LOCK BIT (2000), AND THE SHIFT BIT (1000). IF YOU REALLY WANT TO HACK AROUND WITH 12-BIT KEYBOARD INPUT, THIS IS YOUR CUP OF T. THURSDAY JAN 06,1977 FM+1D.23H.52M.11S. LISP 1252 - GLS - WELL, FOLKS, JONL HAS GONE TO IBM FOR SEVERAL MOONS, AND I AM WORKING ON MY THESIS THIS SEMESTER (DUE IN MAY), SO DON'T EXPECT TO GET NEW FEATURES IMPLEMENTED WITH BLINDING SPEED. I WILL DO MY BEST TO FIX ANY BUGS THAT CROP UP (IN PARTICULAR, I BELIEVE I HAVE FIXED THE NEFARIOUS FASLOAD BUG OF VERSION 1251). MOST OF THE ITEMS BELOW ARE NOT BRAND NEW, BUT JUST THINGS THAT DIDN'T WORK UNTIL NOW OR WERE NEVER DOCUMENTED PROPERLY. AS USUAL, NUMBERS=ALL LISPS, LETTERS=NEWIO ONLY. [1] PRINC NOW NO LONGER AUTO-TERPRI'S BEFORE ATOMS. [2] NEW "EVALSHUNT" HACK FOR PECULIAR FORMS. [3] GC NOW MARKS HUNKS MORE SPACE-EFFICIENTLY. [4] HOW TO DEFINE NEW EDITOR COMMANDS. [A] NEW FUNCTION: +TYO [B] SEEING GC STATISTICS IN THE WHO-LINE. ---------------------------------------------------------------- [1] PRINC NOW NO LONGER ATTEMPTS TO GET IN A TERPRI BEFORE AN ATOM IF NECESSARY. (IT DOES, HOWEVER, PROVIDE A TERPRI ON REACHING THE LINEL UNLESS OTHERWISE OVERRIDDEN BY THE VALUE OF TERPRI OR BY (SSTATUS TERPRI ...).) PRIN1 CONTINUES TO PUT IN AUTO-TERPRI'S BEFORE ATOMS. [2] WHEN EVAL COMES UPON A FORM WHOSE CAR IS NON-ATOMIC AND WHOSE CAAR IS NOT LAMBDA, FUNARG, OR LABEL, AND IF THE VALUE OF THE ATOM EVAL IS NON-NIL, THEN THIS VALUE SHOULD BE A FUNCTION OF ONE ARGUMENT, AND IT IS CALLED ON THE FORM. IT IS THE RESPONSIBILITY OF THE FUNCTION TO EVALUATE THE FORM AND DELIVER AN APPROPRIATE VALUE. THIS IS KNOWN AS THE "EVALSHUNT" KLUDGE. [3] GC NOW TAKES MUCH LESS PDL TO MARK HUNKS. IF YOU HAVE GOTTEN PDL OVERFLOW DURING GC WHILE USING HUNKS, THIS SHOULD ALLEVIATE YOUR PROBLEM. [4] IF EDIT READS A COMMAND WHOSE NAME IS NOT RECOGNIZED, THEN IF THE ATOM OF THAT NAME HAS AN EDIT PROPERTY, THEN THAT PROPERTY SHOULD BE A FUNCTION. IT WILL BE CALLED WITH THE REPEAT COUNT AS AN ARGUMENT (0 IS SUPPLIED IF NO ARGUMENT IS GIVEN). THE FUNCTION MAY DO ANYTHING IT LIKES, BUT WILL PROBABLY WANT TO OPERATE ON THE FUNCTION BEING EDITED. THE EDITOR'S CURSOR IS REPRESENTED BY TWO DATA STRUCTURES, THE "LEFT-LIST" AND THE "UP-LIST". THE FORMER SAYS HOW TO BACK UP AT THE CURRENT LEVEL OF LIST; THE LATTER SAYS HOW TO BACK UP A LEVEL OF LIST STRUCTURE. THE LEFT-LIST IS THE VALUE OF THE ATOM  (THREE ALTMODES), AND THE UP-LIST IS THE VALUE OF THE ATOM ^^^ (THREE UPARROWS OR CIRCUMFLEXES, ASCII 136). THE CAR OF THE LEFT-LIST IS THE LEVEL OF LIST STRUCTURE BEING EDITED; THE CURSOR IS CONSIDERED TO BE BEFORE THE CAAR OF THE LEFT-LIST. THE CDR OF THE LEFT-LIST IS THE LEFT-LIST FOR THE PREVIOUS POINT IN THIS LEVEL OF LIST. THE UP-LIST IS A STACK OF OLD LEFT-LISTS. THE FOLLOWING FUNCTIONS ARE USEFUL UTILITIES FOR BUILDING NEW EDITOR FUNCTIONS, AND ILLUSTRATE THE CORRECT WAY TO MANIPULATE THE LEFT-LIST AND UP-LIST. (DEFUN RIGHT () (AND (EDCAR) (SETQ  (CONS (CDAR ) )))) (DEFUN LEFT () (AND  (CDR ) (SETQ  (CDR )))) (DEFUN DOWN () (AND (EDCAAR) (SETQ ^^^ (CONS  ^^^)  (NCONS (CAAR ))))) (DEFUN UP () (AND ^^^ (CAR ^^^) (CDR ^^^) (SETQ  (CAR ^^^) ^^^ (CDR ^^^)))) (DEFUN YANK (FN) ((LAMBDA (PL) (COND (PL (SETQ ^^^ NIL) (SETQ  (NCONS PL))) (T (PRINC '|??|)))) (GETL FN EDIT))) (DEFUN SPLICE (IT) (COND ((AND (LEFT) (EDCAR)) (RPLACD (CAR ) IT) (RIGHT)) ((AND (UP) (EDCAR)) (RPLACA (CAR ) IT) (DOWN)))) (DEFUN KILL () (PROG2 NIL (CAAR ) (SPLICE (COND ((EDCAR) (CDAR )) (T (CAR )))))) (DEFUN INSERT (IT) (SPLICE (CONS IT (AND  (CAR )))) (RIGHT)) (DEFUN EDCAR () (AND  (NOT (ATOM (CAR ))))) (DEFUN EDCAAR () (AND (EDCAR) (NOT (ATOM (CAAR ))))) NOTICE THAT LEFT AND RIGHT AND UP AND DOWN RETURN NIL IF THEY FAIL. KILL RETURNS THE THING KILLED (THE STANDARD EDITOR COMMAND "K" PUTS THIS THING INTO THE VALUE CELL OF "".) AS TWO EXAMPLES OF NEW EDITOR COMMANDS, CONSIDER "XCH" (NOTE THAT NAMES OF EDITOR COMMANDS MUST BE THREE CHARACTERS OR FEWER), WHICH TRANSPOSES THE NEXT TWO ITEMS AFTER THE CURSOR, AND "BRY", WHICH BURIES THE NEXT THING IN LEVELS OF LIST STRUCTURE. (DEFPROP XCH ED-EXCHANGE EDIT) (DEFUN ED-EXCHANGE (N) ;ARGUMENT IS IGNORED (INSERT (PROG2 NIL (KILL) (RIGHT)))) (DEFPROP BRY ED-BURY EDIT) (DEFUN ED-BURY (N) (AND (EDCAR) (DO ((I (MAX N 1) (- I 1))) ((ZEROP I)) (SPLICE (RPLACA (CAR ) (NCONS (CAAR ))))))) I HAVE TESTED THESE DEFINITIONS AND THEY SEEM TO WORK. [A] THE NEW FUNCTION +TYO OF TWO ARGUMENTS IS A SUPER-FAST TYO. THE FIRST ARGUMENT IS THE ASCII VALUE TO OUTPUT AND THE SECOND IS THE FILE TO OUTPUT IT ON. THE ATOM "T" MAY NOT BE USED AS A SECOND ARGUMENT; INSTEAD OF (+TYO 43 T), SAY (+TYO 43 TYO) OR THE EQUIVALENT. ALSO, THE SECOND ARGUMENT MUST BE A SINGLE FILE, NOT A LIST OF FILES. THE +TYO FUNCTION DOES NO ARGUMENT CHECKING IF NOT IN *RSET MODE. IT DOES NOT ATTEMPT TO UPDATE THE CHARPOS OF THE FILE, OR SUPPLY AN AUTO-TERPRI FOR EXCEEDING THE LINEL. IT DOES CHECK FOR NON-IMAGE-MODE TTY FILES AND IN THAT CASE CONVERT ^P AND ^C TO ^P P AND ^P Q. IT ALSO UPDATES THE FILEPOS CORRECTLY. [B] NEWIO HAS HAD FOR SOME TIME STATUS CALLS FOR MANIPULATING THE WHO-LINE; THESE WERE DESCRIBED PREVIOUSLY IN LISP ARCHIV. NOW A NEW STATUS CALL CONTROLS THE DISPLAY OF GC STATISTICS IN THE WHO-LINE. (STATUS GCWHO) RETURNS THE CURRENT GCWHO STATUS AS A FIXNUM. (SSTATUS GCWHO ) SETS THE STATUS TO THE FIXNUM . RIGHT NOW ONLY THE 1 AND 2 BITS OF THE STATUS ARE SIGNIFICANT. 1 MEANS THAT DURING A GC, THE WHO-LINE SHOULD BE ALTERED TO READ "GC:XXXXX" WHERE XXXXX IS THE REASON FOR THE GC. AT THE END OF THE GARBAGE COLLECTION THE WHO-LINE IS RESTORED. 2 MEANS THAT AT THE END OF THE GC THE .WHO2 WORD SHOULD BE CLOBBERED WITH GC RUN TIME INFORMATION. SPECIFICALLY, THE LEFT HALF GETS THE PERCENTAGE OF RUN TIME WHICH HAS BEEN SPENT IN GC, AND THE RIGHT HALF GETS THE GC RUN TIME IN FORTIETHS OF A SECOND. IF THE FIRST TWO ARGUMENTS TO (SSTATUS WHO1 ...) ARE 52 OCTAL AND '%, THEN THESE STATISTICS WILL BE PRINTED IN THE FORM "NNN% HH:MM:DD.T", JUST LIKE THE STANDARD SYSTEM RUNTIME PERCENTAGE AND VALUE. IN THIS WAY ONE CAN CONTINUOUSLY MONITOR GC RUN TIME STATISTICS. THE 1 AND 2 BITS MAY BE USED TOGETHER (3) OR INDEPENDENTLY. NOTE THAT WHILE USING THE 2 BIT THE .WHO3 VARIABLE IS STILL LEFT OVER FOR USE BY THE USER. THUS ONE MIGHT SAY: (SSTATUS WHO1 52 '% 166 0) (SSTATUS GCWHO 3) (SSTATUS WHO3 'QUUX) AND ONE WOULD NORMALLY SEE "43% 00:15:07.8 QUUX", BUT DURING A GC ONE WOULD SEE "GC:FIXNUM" OR WHATEVER. A NOTE FOR THOSE WHO USE SUSPEND: IF THE SUSPENDED JOB IS DUMPED OUT AND LATER RELOADED, THE RUNTIME (MAINTAINED BY THE TIME-SHARING SYSTEM) WILL HAVE BEEN RESET, BUT NOT THE GCTIME, WHICH IS MAINTAINED BY LISP. THEREFORE A ROUTINE WHICH DOES A SUSPEND SHOULD PERFORM (SSTATUS GCTIME 0) ON RETURN FROM THE SUSPEND IN ORDER TO MAKE THE WHO-LINE AND OTHER GC STATISTICS ACCURATE. WEDNESDAY DEC 29,1976 FQ+1D.9H.29M.54S. LISP 1251 -JONL- AS USUAL, NUMBERED ITEMS APPLY BOTH TO OLDIO AND NEWIO LISPS; LETTERED ITEMS APPLY ONLY TO NEWIO. 1) THE FUNCTION "RANDOM" HAS BEEN SLIGHTLY IMPROVED 2) NUMBERS GIVEN AS FILE-NAME ARGUMENTS ARE NOW CONVERTED TO SYMBOLIC STRINGS ACCORDING TO A RIGID ALGORITHM. 3) ALLOC NO LONGER ASKS FOR "CORE?". 4) ALL VERSIONS ARE NOW BIBOP. TOPS-10 VERSION IS FULLY BIBOPIFIED. 5) MACDMP HAS BEEN FLUSHED. USE SUSPEND. 6) THE VALUE OF THE ATOM "TERPRI" NOW CONTROLS THE AUTOMATIC INSERTION OF NEWLINE CHARACTERS IN THE CHARACTER OUTPUT STREAMS. 7) MORE THINGS OPEN-CODED BY NCOMPLR, AND OTHER UPDATES 8) EDIT ALLOWS THE USER TO DEFINE NEW EDITING FUNCTIONS: [A] HOW TO USE DEFAULT LINEL AND PAGEL FOR FILES. [B] NCOMPLR THINKS IT KNOWS ABOUT INCLUDE NOW [C] WHO-LINES ON AI TV-TERMINALS ARE NOW USABLE. ---------------------------------------------------------------- 1) "RANDOM" CHANGED SLIGHTLY. NEW ALGORITHM FROM KNUTH IS MUCH BETTER - NO LONGER HAS THE CORRELATED-TRIPLES PROPERTY. (RANDOM NIL) AS WELL AS ANY TWO-ARGUMENT CALL TO RANDOM RESTARTS THE GENERATOR OVER AT ITS BEGINNING. TIMING IS THE SAME. 2) FIXNUMS GIVEN AS FILE NAMES: PREVIOUSLY, THESE WERE CONVERTED TO CHARACTER STRINGS MERELY BY PRINTING IN THE CURRENT BASE. NOW, THE BASE IS TEMPORARILY LAMBDA-BOUND TO TEN, AND *NOPOINT TO NIL, DURING THE CONVERSION. FOR EXAMPLE, IF BASE=IBASE=8, THEN TYPING IN AND EVALING THE FORM (UREAD TEST 131 DSK LOSER) WILL RESULT IN SELECTING THE FILE DSK:LOSER;TEST 89 3) ALLOC NO LONGER ASKS FOR "CORE". A # WILL PROMP THE ENTRIES THAT CANNOT BE EXPANDED AFTER ALLOCATION. FOR ITS VERSIONS ONLY THE PDLS CANNOT BE EXPANDED, BUT IN THE TOPS-10 VERSION, BINARY-PROGRAM-SPACE MAY NOT BE FURTHER EXPANDED. 4) AND 5) HOORAY, HOORAY! 6) THE VALUE OF THE ATOM "TERPRI" NOW CONTROLS THE AUTOMATIC INSERTION OF NEWLINE CHARACTERS IN THE CHARACTER OUTPUT STREAMS. IF NON-NIL, THEN ALL SUCH AUTOMATIC INSERTION IS SUPPRESSED FOR ALL OUTPUT FILES AND DEVICES, REGARDLESS OF THEIR PARTICULAR LINELS. IN NEWIO, IF THE LINEL FOR A PARTICULAR OUTPUT FILE IS 0, THEN THE AUTOMATIC INSERTION IS SUPPRESSED FOR THAT FILE. 7) NCOMPLR NOW OPEN-CODES TYPEP, ATOM, NUMBERP, FIXP, FLOATP, BIGP, ZEROP, MINUSP, PLUSP, AND HUNKP USING THE SEGMENT TABLE. FOR TOPS-10 LUSERS: THE MAKLAP PARSER ACCEPTS PPN DESIGNATIONS IN SQUARE BRACKETS. FOR ITS LUSERS: @DEFINE HAS BEEN DEFINED. SEE DOCUMENTATION FOR THE @ CROSS-REFERENCING PROGRAM. THE VALUE OF THE ATOM "GCPROTECT" NOW CONTROLS HOW LAP AND FASLOAD USE THAT FUNCTION. THIS IS A SPECIAL HAC FOR OWL SYSTEM, AND NO ONE ELSE SHOULD EVER SET "GCPROTECT" TO NON-NIL. 8) EDIT ALLOWS THE USER TO DEFINE NEW EDITING FUNCTIONS. PUTTING AN "EDIT" PROPERTY ON AN ATOM MAKES IT AN EDITOR COMMAND, AND WHEN INVOKED, THAT FUNCTIONS IS CALLED WITH THREE ARGUMENTS: I) REPEAT COUNT II) THE CURRENT "LEFT-LIST" (VALUE OF THE ATOM ) III) THE CURRENT "UP-LIST" FOR MORE DETAILS, SEE THE FILE MC:LISP;EDITOR > [A] WHENEVER A FILE-OBJECT IS CREATED, SUCH AS BY "OPEN", THE LINEL AND PAGEL ARE SET FROM AN INTERNAL DEFAULT VALUE. THESE VALUES ARE ACCESSED BY (LINEL NIL) (PAGEL NIL), AND SET TO NEW VALUES BY (LINEL NIL ) (PAGEL NIL ) [B] QCOMPLR THINKS IT KNOWS ABOUT INCLUDE. WHAT MORE CAN WE SAY? [C] THERE ARE THREE WHO-LINES USABLE FROM LISP ON THE AI MACHINE, AND THE GARBAGE-COLLECTOR CAN DISPLAY ITS OPERATIONS ON A WHO-LINE QUUX WILL DOCUMENT THIS STUFF AS AND WHEN IT IS OPERATIONAL. TUESDAY SEPT 14,1976 FM+6D.1H.33M.7S. LISP 1211 -GLS,JONL- OLDIO AND NEWIO LISPS NOW BOTH ANNOUNCE THEMSELVES AS SUCH. YOU CAN GET AN OLDIO BY TYPING OLDIO^K OR O^K; AS BEFORE, NEWIO^K OR Q^K GETS A NEWIO. IN THE NEAR FUTURE, LISP^K AND L^K WILL START PROVIDING A NEWIO INSTEAD OF AN OLDIO. OLDIO WILL STILL BE AVAILABLE AS OLDIO^K OR O^K FOR SEVERAL MONTHS AFTER THAT. NUMBERED ITEMS BELOW APPLY TO ALL LISPS; LETTERED ONES TO NEWIO ONLY. [1] WHAT ARE PEOPLE USING HUNKS FOR? [2] NEW ARITHMETIC FUNCTION: IFIX [3] "AUTOLOAD" HAS LOWER PRIORITY THAN OTHER FUNCTIONAL PROPERTIES [4] ALLOC FUNCTION AND GC PRINTOUT SUPPRESS ZERO-SIZE SPACES [5] EVALHOOK NOW HOOKS BOTH A MACRO CALL AND ITS EXPANSION [6] NEW .FASL MACRO PRINTS SUPPRESSABLE LOAD MESSAGE [7] CHANGES TO EDIT FUNCTION AND NEW COMMANDS [A] NEWIO NOW PROVIDES A ##MORE## PROCESSOR [B] NEW NVID, SLAVE, MPX PACKAGES FOR NEWIO [C] PROBLEM WITH INIT FILES IN NEWIO: UREAD DOESN'T CLOSE THEM [D] UNTRAPPED MEMORY AND MACHINE ERRORS NOW GO TO DDT [E] CHANGES TO HANDLING OF TTY BLOCK OUTPUT [F] BUG OF FASLOAD FROM WITHIN FASLOAD-FILE-NOT-FOUND BREAK FIXED [G] STUPID SPACE-SWALLOWING THING ONLY HAPPENS IF READ IS NIL [H] NEW CURSORPOS FEATURES: A, H, I, V [I] THE ACTION AT END-OF-FILE HAS BEEN CHANGED ---------------------------------------------------------------- [1] IF YOU USE HUNKS, SEND SOME MAIL TO GLS SAYING FOR WHAT. (JUST NOSY, I GUESS.) NCOMPLR NOW OPEN-CODES CXR. [2] (IFIX X) IS JUST LIKE (FIX X), EXCEPT THAT X IS CONSTRAINED TO BE WITHIN THE RANGE OF FIXNUMS. WHILE "FIX" MAY RETURN A BIGNUM, "IFIX" WILL NOT, AND THIS ALLOWS EFFICIENT OPEN-CODING OF "IFIX". CAVEAT EMPTOR! THIS IS NOT THE SAME FUNCTION AS FORTRAN'S "IFIX": THIS ONE IS THE SAME AS THE "ENTIER" FUNCTION, AS IN ALGOL. [3] WHENEVER LISP LOOKS UP A FUNCTION ON A PROPERTY LIST, IT WILL NOW PREFER A SUBR, EXPR, ETC. TO AN AUTOLOAD PROPERTY EVEN IF THE SUBR (OR WHATEVER) OCCURS AFTER THE AUTOLOAD PROPERTY ON THE PROPERTY LIST. THAT IS, IT EFFECTIVELY LOOKS FOR OTHER FUNCTIONAL PROPERTIES FIRST, AND ONLY ON FAILURE DOES LISP CHECK FOR AN AUTOLOAD PROPERTY. THIS FIXES THE SCREW WHERE ONE PACKAGE DEFINES THE SUBR FOO AND THEN ANOTHER DOES (DEFPROP FOO ... AUTOLOAD). [4] IF A SPACE HAS ZERO SIZE (OFTEN TRUE OF HUNK SPACES!), THEN THE ALLOC FUNCTION WILL NOT INCLUDE THE SPACE IN THE RETURNED DATA, AND GC STATISTICS PRINTOUT WILL NOT MENTION THE SPACE. (STATUS SPCNAMES) WILL, HOWEVER, MENTION ALL SPACES, EVEN THOSE OF ZERO SIZE. [5] EVALHOOK NOW HOOKS BOTH A MACRO CALL AND ITS EXPANSION. FORMERLY THE HOOK FUNCTION SAW THE MACRO CALL, AND THEN THE FIRST FORM WITHIN THE EXPANSION, BUT NOT THE EXPANSION ITSELF. [6] MANY AUXILLIARY FILES, SUCH AS "GRIND", "LAP", "ALLFILES", ETC. WHICH ARE AUTOLOADABLE, OR FASLOADED BY THE USER, PRINT A MESSAGE ANNOUNCING THEIR VERSION NUMBER AND THE FACT THAT THEY ARE BEING LOADED. FOR EXAMPLE, WHEN ALLFILES IS LOADED, IT PRINTS ;LOADING ALLFILES 43 BY CONVENTION, ALL SUCH LOADING MESSAGES ARE SUPPRESSED IF THE USER HAS DONE (SSTATUS FEATURE NOLDMSG). ALL SUCH FILES WRITTEN IN LISP HAVE EXPR CODE WHICH CHECKS THE FEATURE LIST FOR "NOLDMSG", AND IF ABSENT, PRINTS THE LOADING MESSAGE. TO FACILITATE SUCH A MESSAGE PRINTING FEATURE FOR PACKAGES WRITTEN IN MIDAS, THE STANDARD FILE "SYS:.FASL DEFS", TO BE INSERTED BY .FASL FILES, NOW HAS A MACRO "VERPRT". ITS ARGUMENT SHOULD BE THE NAME OF THE PACKAGE; IT GENERATES A .SXEVAL FORM WHICH WILL PRINT A MESSAGE WHEN THE FILE IS LOADED. FOR EXAMPLE, THE ALLFILES PACKAGE EFFECTIVELY BEGINS: TITLE ALLFILES .FASL .INSRT SYS:.FASL DEFS VERPRT ALLFILES THE GENERATED FORM WORKS IN EITHER OLDIO OR NEWIO; IN NEWIO, THE MESSAGE IS PRINTED ON THE FILES SPECIFIED BY THE VARIABLE "MSGFILES" (WHICH IS ALSO USED BY ALL LISP SYSTEM MESSAGES). [7] CHANGES TO THE "BINFORD EDITOR" (EDIT FUNCTION): [7.1] THE COMMANDS "C" AND "-C" HAVE DISAPPEARED. THEY WERE EQUIVALENT TO THE STILL-EXISTING "F" AND "-F" COMMANDS. [7.2] "SS" = "SAVE SPOT", "RS" = "RESTORE SPOT" BOTH TAKE AN ATOMIC SYMBOL AS AN ARGUMENT. SS SAVES THE CURRENT "SPOT" (WHERE THE $$ APPEARS) AS THE VALUE OF THE SPECIFIED VARIABLE, AND RS RETURNS TO THAT SPOT. THUS: SS FOO ... LOTSA EDITING ... RS FOO [7.3] AN ARGUMENT TO EDIT NO LONGER CONTROLS THE AUTO-PRINT FEATURE (SEE [7.4] BELOW); INSTEAD, IT SHOULD BE AN ATOMIC SYMBOL, THE NAME OF A FUNCTION. AS THE EDITOR IS ENTERED, THAT FUNCTION IS "YANKED" SO THAT EDITING MAY BEGIN ON ITS CODE WITHOUT EXPLICITLY USING THE "Y" COMMAND. THE VALUE OF THE VARIABLE "EDIT" CONTROLS WHICH PROPERTIES WILL BE HUNTED FOR BY THE "Y" OPERATION [INITIAL VALUE IS (EXPR FEXPR MACRO)]. [7.4] "SP" = "START/STOP PRINTING" TOGGLES THE STATE OF THE AUTOMATIC PRINTOUT AFTER EACH COMMAND. [7.5] "-KI" IS LIKE "L KI"; THAT IS, IT REPLACES THE PRECEDING S-EXPRESSION WITH ITS ARGUMENT. [7.6] AN "S" COMMAND IMMEDIATELY FOLLOWED BY "$$" (I.E. A NULL SEARCH STRING" WILL REPEAT THE PREVIOUS SEARCH, AS IN TECO. [7.7] YANKING IN A VALUE PROPERTY NOW WINS. THUS: YP FOO VALUE $$ ALLOWS YOU TO EDIT THE VALUE PROPERTY OF FOO. ---------------------------------------------------------------- [A] NEWIO NOW PROVIDES A ##MORE## PROCESSOR, IF YOU ARE IN ":TCTYP MORE" MODE WHEN LISP STARTS UP. WHEN THE END OF THE SCREEN IS REACHED, "##MORE##" IS PRINTED, AND LISP WAITS FOR A CHARACTER. SPACE OR RUBOUT IS SWALLOWED, AND ANYTHING ELSE IS LEFT TO BE SEEN BY LATER ##MORE##'S (AND EVENTUALLY BY READ). THE STATE OF THE ##MORE## INTERRUPT MAY STILL BE TOGGLED BY TYPING M AT LISP, AS WITH ANY OTHER ITS JOB. [B] THE VARIOUS MOBYIO FEATURES IMPLEMETED ONLY ON THE AI MACHINE (SUCH AS REAL AND FAKE TV'S, 340 STUFF, PLOTLIST AND MULTIPLEXOR ROUTINES) HAVE BEEN CODED AS AUTOLOAD PACKAGES FOR NEWIO. THEY ARE VIRTUALLY UNTESTED, AND WE WOULD APPRECIATE IT IF TV AND 340 HACKERS WOULD GIVE THEM A TRY AND HELP FIND THE BUGS. [C] .LISP. (INIT) FILES ARE NOT HANDLED VIA THE UREAD MECHANISM IN NEWIO. A STANDARD TRICK IN OLDIO, NOT USABLE IN NEWIO, IS TO CALL UREAD IN THE LAST FORM IN AN INIT FILE, AND DEPEND ON IT TO CLOSE THE INIT FILE BEFORE OPENING THE NEW ONE. SINCE THIS DOESN'T WORK IN NEWIO, IT MAY HAPPEN THAT AN .INIT. FILE IS NEVER CLOSED. THERE ARE TWO SOLUTIONS: (1) LET THE .INIT. FILE EXPLICITLY CLOSE ITSELF, AND POP THE INPUT STACK, DURING THE EVALUATION OF THE LAST FORM. E.G. (COMMENT CORE 120 . . .) ;RELIC FOR ALLOC (DO SOME STUFF) . . . ;MORE STUFF (PROGN (CLOSE INFILE) (INPUSH -1)) (2) ARRANGE NOT TO RESET ^Q TO NIL IN THE INIT FILE, SO THAT THE TOP-LEVEL READ-EVAL-PRINT LOOP WILL ENCOUNTER END-OF-FILE AND CLOSE IT FOR YOU. [D] THE OLD MESSAGE ABOUT ;REFERENCE TO NON-EXISTENT MEMORY FROM LOCATION 314159 ;PROGRAM TRAPPED WHILE IN COMPLETELY-CRETINOUS-ROUTINE HAS BEEN FLUSHED IN NEWIO. NOW, WHEN A MEMORY PROTECT VIOLATION, WRITE INTO READ-ONLY MEMORY, ILLEGAL OPERATION, OR PARITY ERROR OCCURS, NEWIO CHECKS THE VALUE OF THE ATOM "MACHINE-ERROR", AS PREVIOUSLY DOCUMENTED. IF NON-NIL, IT IS THE USER HANDLER FOR THE ERROR. IF NIL, LISP REFLECTS THE INTERRUPT BACK OUT, AND DDT HANDLES IT, PRINTING THE FAMILAR MESSAGE: MPV; 314159>>MOVE 1,(2) 1/ 43 271828/ ?? WHICH MAY SEEM SOMEWHAT MORE CRYPTIC, BUT WILL MAKE IT MUCH EASIER FOR KNOWLEDGEABLE LISP HACKERS TO DEBUG THE ERROR. TO GET THE EFFECT OF THE OLD HANDLER (RETURN TO TOP LEVEL), TYPE $G TO DDT. SYSTEMS SUCH AS MACSYMA WHICH REQUIRE A BETTER USER INTERFACE SHOULD PROVIDE A MACHINE-ERROR USER INTERRUPT HANDLER. [E] ALL TTY BLOCK OUTPUT IN NEWIO IS NOW DONE WITH SIOT. AS A COROLLARY, A FILE WRITTEN IN TTY BLOCK IMAGE OUTPUT MODE WILL WRITE 8-BIT CHARACTERS, AND TTY BLOCK FIXNUM OUTPUT WILL WRITE 12.-BIT CHARACTERS. SUPER SYSTEMS HACKERS TAKE NOTE! [F] BUG OF FASLOAD FROM WITHIN FASLOAD-FILE-NOT-FOUND BREAK FIXED. WHEN YOU GET A FILE-NOT-FOUND ERROR FROM FASLOAD, IT NOW WORKS TO REPEAT THE FASLOAD WITHOUT EXITING FROM THE BREAK. [G] THE KLUDGE WHERE LISP'S TOP-LEVEL AND BREAK-LEVEL SWALLOW A SPACE AFTER AN ATOM DOES NOT HAPPEN IF THE USER SUPPLIED A READ FUNCTION BY SETQ'ING THE VARIABLE "READ". [H] NEW CURSORPOS FEATURES: A, H, I, V (CURSORPOS 'A) ADVANCES TO A FRESH LINE; THAT IS, IT DOES A TERPRI UNLESS THE TTY IS ALREADY AT THE BEGINNING OF A LINE. (CURSORPOS 'P) (OUTPUT A ^P) HAS BEEN FLUSHED. (TYO 20) NOW DOES THE RIGHT THING IN NEWIO. (CURSORPOS 'H ) SETS JUST THE HORIZONTAL POSITION TO WITHOUT AFFECTING THE VERTICAL POSITION. (CURSORPOS 'V ) SIMILARLY SETS THE VERTICAL POSITION. (CURSORPOS 'I ) OUTPUTS ASCII CODE AS A ONE-POSITION PRINTING CHARACTER (WILL NOT WORK UNTIL IMPLEMENTED IN ITS, WHICH ISN'T YET!). [I] THE ACTION AT END-OF-FILE, CONTRARY TO THE MOONUAL, IS NOW: IF WITHIN READ IN THE MIDDLE OF AN OBJECT (TYI CANNOT BE "IN THE MIDDLE OF AN OBJECT") SIGNAL A READ-EOF ERROR. OTHERWISE, IF NO USER EOF HANDLER BELONGS TO THE FILE, THEN CLOSE THE FILE UNLESS IT IS A TTY (EOF ON A TTY MERELY MEANS OVER-RUBOUT), POP THE INPUT STACK (BY DOING (INPUSH -1)), THEN IF WITHIN A READ THAT HAD ARGUMENTS RETURN THE EOF VALUE, AND OTHERWISE REPEAT THE READ FROM THE NOW CURRENT FILE POPPED. IF THERE WAS A USER EOF HANDLER, THEN CALL IT WITH THE FILE AND EOF VALUE AS ARGUMENTS. WHEN IT RETURNS, THEN IF IT RETURNED NIL, CLOSE THE FILE (UNLESS IT IS A TTY) AND POP THE INPUT STACK, THEN REPEAT THE READ FROM THE NEW CURRENT INPUT FILE. IF IT RETURNED T, REPEAT THE READ USING WHATEVER SOURCE THE EOF HANDLER MADE CURRENT. IF IT RETURNED ANY OTHER VALUE, THEN IF NOT WITHIN A READ WITH ARGUMENTS, PRETEND IT RETURNED NIL. OTHERWISE, EXIT THE READ WITH THE VALUE RETURNED BY THE EOF HANDLER. IN THE ABOVE, "READ" REFERS TO WHATEVER INPUT FUNCTION WAS CALLED, SUCH AS READ, READLINE, TYI, ETC. THURSDAY JULY 01,1976 NM+4D.11H.48M.23S. LISP 1168 - GLS - [1] HUNK STUFF HAS CHANGED; HUNK,HUNKIFY => MAKHUNK,HUNK [2] TOPLEVEL AND BREAKLEVEL FLUSH SPACES AFTER ATOMS [3] PRINT IS MORE CLEVER ABOUT AUTO-TERPRI AND PRINLEVEL [4] NEW FUNCTION "SUBR" FINDS ROUTINE A PC IS IN FOR NEWIO ONLY: [A] MAR-BREAK INTERRUPT TURNS OFF MAR [B] ALL THE NEW INTERRUPTS RUN IN (NOINTERRUPT T) STATE [C] THE VARIABLE DEFAULTF IS THE DEFAULT FILE NAMES [D] MACHINE-ERROR INTERRUPT NOW GETS MORE ARGUMENTS ---------------------------------------------------------------- [1] THE HUNK STUFF HAS BEEN REVISED AS FOLLOWS: (CXR 0 X) = (CDR X), (CXR 1 X) = (CAR X) THIS IS THE REVERSE OF WHAT IT INITIALLY WAS. THE OTHER COMPONENTS ARE STILL COMPONENTS 2 THROUGH N-1. THE OLD "HUNKIFY" FUNCTION HAS BEEN RENAMED "HUNK". IT TAKES ITS ARGUMENTS IN THE ORDER 1, 2, 3, ..., N-1, 0. THIS IS THE ORDER THEY ARE PRINTED IN. THUS: (SETQ FOO (HUNK 1 2 3 4 5)) (1 . 2 . 3 . 4 . 5) (CXR 1 FOO) 1 (CXR 2 FOO) 2 (CXR 0 FOO) 5 THE OLD "HUNK" FUNCTION HAS BEEN RENAMED "MAKHUNK". IT ALSO HAS AN EXTENDED DEFINITION: IF THE ARGUMENT TO MAKHUNK IS A FIXNUM, IT CREATES A HUNK THAT BIG FILLED WITH NILS. IF THE ARGUMENT IS A LIST, IT CREATES A HUNK FILLED WITH THE ELEMENTS OF THE LIST. THUS (MAKHUNK (LIST A B C D)) = (HUNK A B C D) [2] IN THE SYSTEM-SUPPLIED TOPLEVEL AND BREAKLEVEL READ-EVAL-PRINT LOOPS, JUST AFTER AN ITEM IS READ THE FOLLOWING OCCURS: (AND (ATOM THE-ITEM) (NOT (ZEROP (BOOLE 1 100000 (STATUS SYNTAX (TYIPEEK))))) (TYI)) IN THIS WAY THE SPACE THAT TERMINATED THE ATOM (IF IT WAS IN FACT A SPACE) IS FLUSHED. THIS IS SO THAT THE SPACE WILL NOT HANG AROUND AND CONFUSE, E.G., **MORE** PROCESSING. USER TOPLEVELS AND BREAKLEVELS SHOULD DO A SIMILAR THING. I WOULD APPRECIATE GETTING COMMENTS ABOUT THIS GENERAL PROBLEM ABOUT SPACES AFTER ATOMS. SHOULD THERE BE TWO READ FUNCTIONS, ONE WHICH FLUSHES SPACES AND ONE WHICH DOES NOT? OR WHAT? -- GLS [3] A NEW USELESS FEATURE OF PRINT IS THAT THE AUTO-TERPRI HACK IS MORE CLEVER. UP TO NOW PRINT HAS CALCULATED THE SIZE OF EACH ATOMIC SYMBOL AND PUT A TERPRI (CARRIAGE RETURN) BEFORE THE SYMBOL IF IT WON'T FIT ON THE CURRENT OUTPUT LINE. NOW IT CALCULATES OR ESTIMATES THE LENGTH OF EACH ATOM (NUMBERS, ETC., AS WELL AS SYMBOLS), AND ALLOWS FOR ANY PARENTHESES WHICH MUST PRECEDE OR FOLLOW THE ATOM. THUS, IF THE NEXT FRAGMENT TO PRINT IS "((FOOBAR)))", PRINT WILL TERPRI IF THERE ARE NOT AT LEAST ELEVEN CHARACTERS LEFT IN THE OUTPUT LINE. THIS MEANS THAT YOU DON'T GET ISOLATED LEFT PARENS AT THE END OF A LINE, OR RIGHT PARENS AT THE BEGINNING OF A LINE. [4] THE NEW FUNCTION "SUBR" (ONLY IN BIBOP LISPS, FOR OBSCURE TECHNICAL REASONS), TAKES ONE ARGUMENT, A FIXNUM, AND TRIES TO DETERMINE WHAT FUNCTION THAT NUMBER WOULD BE A PC IN. THIS HACK IS ONLY APPROXIMATE, AND DEPENDS ON LOOKING AT ALL THE PROPERTY LISTS OF ATOMS IN THE CURRENT OBARRAY. THE ATOM WITH THE CLOSEST REASONABLE SUBR, FSUBR, LSUBR, OR ARRAY PROPERTY IS RETURNED AS THE RESULT. IF NO REASONABLE RESULT IS FOUND, THE ATOM "?" IS RETURNED. (WHAT THIS DOES IS PROVIDE A HANDLE ON AN INTERNAL ROUTINE LISP HAS HAD FOR A LONG TIME ANYWAY. SEE ITEM [D] BELOW.) FOR NEWIO ONLY: [A] WHEN THE MAR-BREAK USER INTERRUPT GOES OFF, AN IMPLICIT (SSTATUS MAR 0 NIL) HAS BEEN PERFORMED. IT IS UP TO THE MAR-BREAK FUNCTION TO RE-ENABLE THE MAR IF DESIRED. THIS IS SIMILAR TO THE OPERATION OF THE ALARMCLOCK FUNCTION. THE INTENTION IS TO HELP PREVENT INFINITE LOOPS. [B] ALL THE NEW ASYNCHRONOUS INTERRUPTS ANNOUNCED LAST TIME, NAMELY MAR-BREAK, SYS-DEATH, AND TTY-RETURN, ARE RUN IN (NOINTERRUPT T) MODE JUST LIKE TTY CHARACTER INTERRUPTS. (I FORGOT TO DOCUMENT THIS LAST TIME.) [C] THE VARIABLE DEFAULTF NOW CONTAINS NEWIO'S DEFAULT FILE NAMES, IN THE FORM OF A NAMELIST. THIS IS SO YOU CAN LAMBDA-BIND THEM. THE FUNCTION DEFAULTF STILL EXISTS AND IS EQUIVALENT TO: (DEFUN DEFAULTF (X) (SETQ DEFAULTF (MERGEF (OR X DEFAULTF) DEFAULTF))) [D] THE MACHINE-ERROR INTERRUPT HAS BEEN CHANGED TO TAKE FOUR ARGUMENTS. THEY ARE A SYMBOL AND THREE FIXNUMS, IN THAT ORDER (THIS INVOLVES A REVERSAL OF ITS FORMAR ARGUMENTS.) THE SYMBOL STILL INDICATES THE ERROR TYPE. THE THREE FIXNUMS ARE, IN ORDER, THE LOCATION OF THE ERROR, THE PC AS OF THE ERROR, AND THE JPC AS OF THE ERROR. FOR THE NONCE, THE FIRST AND THIRD FIXNUMS ARE ALWAYS ZERO, BUT EVENTUALLY WILL CONTAIN INFORMATION AS CORRECT AS ITS CAN SUPPLY. AS AN EXAMPLE OF A MACHINE-ERROR FUNCTION, THIS ONE DOES APPROXIMATELY WHAT THE SYSTEM DEFAULT HANDLER DOES: (DEFUN MACHINE-ERROR-HANDLER (TYPE LOC PC JPC) (TERPRI) (PRINC (COND ((EQ TYPE 'EXAMINE) '|;REFERENCE TO NON-EXISTENT MEMORY|) ((EQ TYPE 'DEPOSIT) '|;WRITE INTO READ-ONLY MEMORY|) ((EQ TYPE 'EVAL) '|;ILLEGAL MACHINE OPERATION|) ((EQ TYPE 'ODDP) '|;PARITY ERROR|))) (PRINC '| FROM LOCATION |) (PRIN1 PC) (TERPRI) (PRINC '|;PROGRAM TRAPPED WHILE IN |) (PRIN1 (SUBR PC)) ;SEE ITEM [4] ABOVE FOR SUBR (ERROR)) ANOTHER ONE TO USE IS: (DEFUN MACHINE-ERROR-HANDLER (TYPE LOC PC JPC) ((LAMBDA (ARGS) (BREAK MACHINE-ERROR)) (LIST (COND ((EQ TYPE 'EXAMINE) 'REFERENCE-TO-NON-EXISTENT-MEMORY) ((EQ TYPE 'DEPOSIT) 'WRITE-INTO-READ-ONLY-MEMORY) ((EQ TYPE 'EVAL) 'ILLEGAL-MACHINE-OPERATION) ((EQ TYPE 'ODDP) 'PARITY-ERROR)) 'AT 'LOCATION LOC 'FROM 'WITHIN (SUBR PC)))) WHEN THE BREAK OCCURS, THE VARIABLE ARGS, FOLLOWING CONVENTION, HAS THE USEFUL DATA. TUESDAY JUNE 15,1976 FM+3D.2H.27M.33S. LISP 1160 - GLS - NOTE THAT NUMBERED ITEMS ARE FOR BOTH NEWIO AND OLDIO, WHILE LETTERED ITEMS ARE FOR NEWIO ONLY. NOTE ALSO THAT NUMBERED AND LETTERED ITEMS ARE INTERMIXED SLIGHTLY. [0] NEW COMPILER FEATURES [0A] (PROGN 'COMPILE A1 ... AN) AT TOP LEVEL COMPILES A1 ... AN [0B] (DEFUN (FOO BAR) ...) PULLS A SPECIAL GENSYM HACK [0C] (RECOMPL '(A B C ...)) IS USED TO RECOMPILE A FILE [0D] THE COMPILER NOW RECOGNIZES (CGOL) SPECIALLY [1] THE VARIABLE ZFUZZ CONTROLS PRECISION OF PLUS AND DIFFERENCE [2] DEFPROP AND DEFUN DO A REMPROP LOOP, NOT JUST A SINGLE REMPROP [3] P% IS "LISP TYPEOUT MODE", AND GETS SET UP IN & IF POSSIBLE [A] TYI ARRANGES TO READ NON-ACTIVATION CHARACTERS [B] TYI ON TTY DOESN'T CONFUSE CURSORPOS ANY MORE [C] THE VARIABLES TYI AND TYO CONTAIN THE INITIAL TTY FILE OBJECTS [D] SETQ OF READ NOW WORKS IN NEWIO; "LOAD" USES IT TOO [E] RECALL THAT HH$X IS BB$X IN NEWIO [F] SPECIAL TREATMENT OF CTRL AND META CHARACTERS IN NEWIO [G] MAR INTERRUPT FEATURE [F1] THE MAR-BREAK USER INTERRUPT [F2] (STATUS MAR) AND (SSTATUS MAR) [F3] SUSPEND SAVES AND RESTORES THE MAR [F4] ^G CIRCUMVENTS THE MAR ON RESTORED VARIABLES [H] OTHER NEW USER INTERRUPTS [G1] TTY-RETURN (TTY JUST RETURNED TO THE JOB) [G2] SYS-DEATH AND (STATUS ITS) [G3] MACHINE-ERROR (MEMORY ERRORS, ILLEGAL OPERS, PARITY ERRORS) [4] HUNKS PACKAGE [5A] NEW DATA TYPES [5B] NEW PRIMITIVES: CXR, RPLACX, HUNK, HUNKIFY, HUNKSIZE [5C] EQUAL AND SXHASH TREAT HUNKS SPECIALLY [5D] PRINT TREATS HUNKS SPECIALLY [5E] TREATMENT OF HUNKS AS LIST STRUCTURE [5F] (STATUS FEATURE HUNK) [5G] (STATUS SPCNAMES) [5H] (STATUS GCSIZE), ETC., AND (ALLOC X) [I] HUMBLE PACKAGE FOR HACKING INFERIOR JOBS ON ITS [I1] SPECIAL VARIABLES AND THE JOB TABLE [I2] CREATE-JOB [I3] SELECT-JOB [I4] KILL-JOB [I5] LOAD-JOB [I6] JOB-USET-READ AND JOB-USET-WRITE [I7] EXAMINE-JOB AND DEPOSIT-JOB [I8] *ATTY AND *DTTY [I9] AUXILIARY PACKAGES ---------------------------------------------------------------- [0] NEW COMPILER FEATURES [0A] IF THE FORM (PROGN 'COMPILE A1 ... AN) IS SEEN AT THE TOP LEVEL OF A FILE, THE COMPILER COMPILES THE FORMS A1 ... AN AS IF THEY ALL WERE SEEN AT TOP LEVEL. IN THIS WAY A MACRO CAN "RETURN MULTIPLE FORMS" TO BE COMPILED (AFTER ALL, THE CONSTRUCT ALSO WORKS IN THE INTERPRETER). [0B] (DEFUN (FOO BAR) ...) IN THE INTERPRETER DEFINES FOO TO HAVE A BAR PROPERTY WHICH IS A LAMBDA EXPRESSION. THE COMPILER CREATES A GENSYM G0034, OUTPUTS THE FORM (DEFPROP FOO G0034 BAR), AND THEN COMPILES THE FUNCTION UNDER THE NAME G0034. IN THIS WAY (FUNCALL (GET 'FOO 'BAR) ...) WILL ALWAYS WORK, FOR EXAMPLE. CONTRAST THIS WITH (DEFUN (FOO BAR BAZ) ...), WHICH IN THE INTERPRETER GIVES FOO A BAR PROPERTY, AND WHEN COMPILED GIVES FOO A BAZ PROPERTY. [0C] THE VARIABLE RECOMPL, IF NON-NIL, CAUSES THE COMPILER TO IGNORE ALL FORMS IN A FILE EXCEPT DECLARATIONS AND FUNCTIONS WHOSE NAMES APPEAR IN THE LIST WHICH IS THE VALUE OF RECOMPL. THE FUNCTION RECOMPL APPENDS ITS ARGUMENT TO THE RECOMPL LIST. THE IDEA IS THAT ONE CAN SPECIFY TO THE COMPILER WHICH FUNCTIONS IN A FILE HAVE CHANGED, AND PRODUCE AN "UPDATE" FASL FILE CONTAINING ONLY THE DIFFERENCES. [0D] THE COMPILER NOW RECOGNIZES THE FORM (CGOL), AND TREATS IT SOMEWHAT LIKE (DECLARE (EVAL (READ))) (CGOL). [1] IF THE VARIABLE ZFUZZ IS NON-NIL, THEN PLUS AND DIFFERENCE PERFORM A SPECIAL FUZZ CHECK ON FLOATING POINT NUMBERS. IF A AND B ARE THE NUMBERS TO BE ADDED (POSSIBLY AFTER CONTAGIOUS CONVERSION TO FLOATING POINT), THEN IF A + B < B * ZFUZZ THEN THE RESULT IS FORCED TO ZERO. THIS HACK WAS INVENTED FOR BMT; IT MAY CHANGE IF HE DECIDES IT ISN'T THE RIGHT THING. [2] BEFORE PUTTING THE NEW PROPERTY ON AN ATOM, DEFPROP AND DEFUN USED TO PERFORM A SINGLE REMPROP OF THE PROPERTY. NOW THEY LOOP, REMOVING ALL INSTANCES OF THE PROPERTY FROM THE ATOM. THIS IS TO ALLOW FOR TRACE, WHICH CREATES ATOMS WITH MULTIPLE OCCURRENCES OF A GIVEN PROPERTY NAME. [3] FOR THOSE WHO HACK LISP FROM DDT: THE SYMBOL P% IS A PUSHJ INSTRUCTION SUITABLE FOR USE AS A DDT USER TYPEOUT MODE (BY DEPOSITING IT INTO ..TAMPER OR SOME SIMILAR LOCATION). IF WHEN THE LISP IS STARTED UP DDT HAS A SYMBOL TABLE LOADED FOR THE LISP, LISP MOVES THE TYPEOUT MODE IN ..TAMPER TO ..TPERCE, AND DEPOSITS P% IN ..TAMPER. IN THIS WAY THE DDT COMMAND & MEANS LISP TYPEOUT MODE, AND SQUOZE TYPEOUT MAY BE DONE VIA $%;. THIS FORM OF LISP TYPEOUT MODE TYPES OUT $Q, NOT THE CONTENTS OF . AS P.$X AND PL.$X DO. IF $Q HAS A NON-ZERO LEFT HALF, THEN BOTH THE LEFT AND RIGHT HALVES ARE PRINTED AS S-EXPRESSIONS, SEPARATED BY ",,". THIS TYPEOUT MODE IS USEFUL IN CONJUNCTION WITH THE "RAID REGISTER" FEATURE OF DDT ($V). REMEMBER, LETTERED ITEMS ARE FOR NEWIO ONLY! [A] WHEN INPUTTING FROM A TTY USING THE TYI FUNCTION (AS OPPOSED TO READ OR READLINE), NEWIO ARRANGES TO SET THE %TIACT BIT. THE EFFECT OF THIS IS TO READ ANY CHARACTER IMMEDIATELY, EVEN IF NO ACTIVATION CHARACTER HAS BEEN TYPED YET. THIS WILL ALLEVIATE THE SCREW INVOLVING (STATUS TTY) FOR MOST PEOPLE. [B] MANY PLACES IN NEWIO ARE NOW MUCH MORE CLEVER ABOUT UPDATING THE CHARPOS AND LINENUM OF A TTY OUTPUT FILE WHEN INPUT HAS BEEN DONE ON THE ASSOCIATED TTY. IN PARTICULAR, THE TYI FUNCTION AND THE PRE-SCAN FUNCTION FOR READ BOTH UPDATE THINGS CORRECTLY. THE VARIOUS DDT TYPEOUT HACKS ALSO ARRANGE TO UPDATE THINGS CORRECTLY. [C] THE VARIABLES TYI AND TYO NOW COME INITIALIZED RESPECTIVELY TO THE INITIAL TTY INPUT AND OUTPUT FILE OBJECTS. T STILL WORKS AS AN ARGUMENT TO MOST I/O FUNCTIONS, BUT TO AVOID AMBIGUITIES USE THE OBJECTS IN TYI AND TYO. ALSO, SEVERAL PLACES IN NEWIO WHICH USED TO SUPPLY A T FOR A FILE OBJECT NOW SUPPLY THE TTY FILE OBJECT ITSELF, PARTICULARLY THE PLACE THAT SUPPLIES ARGUMENTS TO INTERRUPT FUNCTION. [D] NEWIO NOW UNDERSTANDS THAT IF THE VARIABLE READ IS NON-NIL IT IS A USER READ FUNCTION. THE LOAD FUNCTION, WHEN LOADING AN EXPR FILE, USES THIS USER READ FUNCTION ALSO. [E] MORE FOR DDT HACKERS: SINCE THE ^H BREAK WAS RENAMED THE ^B BREAK IN NEWIO, THE HH$X HACK IS CALLED BB$X IN NEWIO. [F] IF AN INPUT TTY IS OPEN IN 12-BIT MODE, THE DEFAULT READ PRE-SCAN FUNCTION TRIES TO THROW AWAY INTERRUPT CHARACTERS. THIS IS SO THAT TOP CHARACTERS CAN GO THROUGH AS ALPHABETICS, WITHOUT LETTING CONTROL CHARACTERS CONFUSE THE READER. IT HAS ALWAYS BEEN TRUE THAT IF A TTY INPUT INTERRUPT FUNCTION WAS REALLY A NUMBER, THEN IT MEANT THAT THE "INTERNAL" INTERRUPT ACTION SPECIFIED BY THAT NUMBER WAS TO BE TAKEN; FURTHERMORE, IF THE 200 OR 400 BIT WAS SET IN THE NUMBER, THE CTRL OR META BIT WAS REQUIRED TO BE PRESENT IN THE TYPED CHARACTER (THIS WAS SO THAT CTRL/G WOULD QUIT BUT "PI" WOULD NOT, FOR INSTANCE). A NEW TWIST IS THAT THE 200000000 AND 400000000 (200 AND 400 IN THE LEFT HALF) BITS REQUIRE THE ABSENCE OF THE CTRL AND META BITS IN THE TYPED CHARACTER FOR THE INTERRUPT ACTION TO TAKE PLACE. THUS, FOR EXAMPLE: (SSTATUS TTYINT 7 207) ;CTRL/G AND META/CTRL/G QUIT (SSTATUS TTYINT 7 607) ;ONLY META/CTRL/G QUITS (SSTATUS TTYINT 7 400000207) ;CTRL/G QUITS, BUT NOT META/CTRL/G (SSTATUS TTYINT 600000007) ;"PI" QUITS, BUT NOT CTRL/G OR META/CTRL/G [G] MAR INTERRUPT FEATURE AT LONG LAST, THE MAR BREAK IS AVAILABLE TO THE LISP USER! THIS IS A FEATURE WHICH DETECTS WHEN A GIVEN MEMORY LOCATION IS REFERENCED AND GIVES AN INTERRUPT. [F1] THE VARIABLE MAR-BREAK, IF NON-NIL, IS A USER INTERRUPT FUNCTION WHICH IS CALLED WHEN THE MAR BREAK IS FIRED. IT TAKES ONE ARGUMENT WHICH PRESENTLY IS ALWAYS NIL. [F2] (STATUS MAR) AND (SSTATUS MAR) TO "ARM" THE MAR BREAK, IT IS NECESSARY TO SAY (SSTATUS MAR N LOC) WHERE N CONTROLS WHEN THE MAR IS FIRED, AND LOC IS THE PLACE TO MONITOR. N MAY TAKE ON THE FOLLOWING VALUES: 0 TURN OFF THE MAR FEATURE 1 BREAK ON INSTRUCTION FETCH 2 BREAK ON WRITE 3 BREAK ON ALL REFERENCES ON THE KL-10, THESE ADDITIONAL VALUES ARE REPUTED TO WORK: 10 BREAK ON DATA READ 11 BREAK ON READ AND FETCH 12 BREAK ON READ AND WRITE, BUT NOT FETCH 13 BREAK ON FETCH AND WRITE, BUT NOT READ THE 4 BIT (EXEC VS. USER MODE) IS IGNORED (USER IS FORCED). LOC IS ANY S-EXPRESSION; THAT CELL IS THE ONE MONITORED. THUS (SETQ FOO (LIST 'A 'B)) (SSTATUS MAR 2 FOO) WILL TRIP THE MAR BREAK IF THE LIST CELL IN FOO IS EVER RPLACA'D OR RPLACD'D. AS AN EXAMPLE: (DEFUN MAR-TRACER (X) (TERPRI) (PRINC '|NOW THE VARIABLE |) (PRIN1 THE-MAR-VARIABLE) (PRINC '| HAS THE VALUE |) (PRIN1 (SYMEVAL THE-MAR-VARIABLE)) (SSTATUS MAR 2 (GET THE-MAR-VARIABLE 'VALUE))) (SETQ MAR-BREAK 'MAR-TRACER) (DEFUN MAR FEXPR (X) (SETQ THE-MAR-VARIABLE (CAR X)) ;; MAKE SURE THE VARIABLE HAS A VALUE CELL (COND ((NOT (BOUNDP THE-MAR-VARIABLE)) (SET THE-MAR-VARIABLE NIL))) (SSTATUS MAR 2 (GET THE-MAR-VARIABLE 'VALUE))) (DEFUN UNMAR () (SSTATUS MAR 0 NIL)) (MAR QUUX) (SETQ QUUX 5) NOW QUUX HAS THE VALUE 5 (DO ((QUUX 0 (+ QUUX 1))) ((= QUUX 2)) (HACK QUUX)) NOW QUUX HAS THE VALUE 0 NOW QUUX HAS THE VALUE 1 NOW QUUX HAS THE VALUE 2 NOW QUUX HAS THE VALUE 5 NIL (STATUS MAR) RETURNS A 2-LIST DESCRIBING THE CURRENT STATE OF THE MAR, OR NIL IF THE MAR IS NOT IN USE. NOTE THAT USING THE MAR FROM DDT WILL NOT CONFUSE LISP, AND LISP TRIES NOT TO CONFUSE DDT. IF LISP IS NOT USING THE MAR, THEN IT DOESN'T EVEN TAKE THE MAR INTERRUPT FROM ITS, AND SO DDT CAN TRAP IT. [F3] THE SUSPEND FUNCTION DOES ITS BEST TO SAVE AND RESTORE THE STATE OF THE MAR. [F4] WHEN A ^G FORCES A QUIT BACK TO TOP LEVEL, THE MAR BREAK IS DISABLED DURING THE UNBINDING OF VARIABLES, AND RE-ENABLED AFTERWARDS. THIS IS BECAUSE DURING A QUIT LISP IS NOT IN A GOOD STATE FOR RUNNING USER INTERRUPTS. [H] OTHER NEW USER INTERRUPTS [G1] TTY-RETURN, IF NON-NIL, IS A USER INTERRUPT FUNCTION WHICH IS RUN WHENEVER THE TTY IS GIVEN TO THE LISP JOB. (THIS IS DRIVEN BY THE %PIATY BIT IN ITS.) THIS IS USEFUL FOR TELLING LISP THAT SOME OTHER JOB MAY HAVE MESSED UP THE SCREEN DISPLAY. THE ARGUMENT TO THE FUNCTION IS PRESENTLY ALWAYS NIL. [G2] SYS-DEATH, IF NON-NIL, IS A USER INTERRUPT FUNCTION WHICH IS RUN WHENEVER THE STATE OF THE SYSTEM IS GOING DOWN, BEING REVIVED, OR BEGIN DEBUGGED. (THIS IS DRIVEN BY THE %PIDWN AND %PIDBG BITS IN ITS.) THE ARGUMENT TO THE FUNCTION IS PRESENTLY ALWAYS NIL. USEFUL IN CONJUNCTION WITH THIS INTERRUPT IS (STATUS ITS). THIS RETURNS A LIST OF FIVE NUMBERS: (1) THE TIME, IN SECONDS, UNTIL THE SYSTEM GOES DOWN, AS A FLONUM, -1.0 IF THE SYSTEM DOES NOT PLAN TO GO DOWN, OR -2.0 IF THE SYSTEM IS ALREADY DOWN. (2) A FIXNUM, NON-ZERO IF THE SYSTEM IS BEING DEBUGGED. (3) THE NUMBER OF USERS ON THE SYSTEM, AS A FIXNUM. (4) THE NUMBER OF MEMORY ERRORS THE SYSTEM HAS SURVIVED. (5) THE TIME IN SECONDS THE SYSTEM HAS BEEN UP, AS A FLONUM. THIS INFORMATION COMES FROM THE ITS "SSTATU" SYSTEM CALL. [G3] MACHINE-ERROR, IF NON-NIL, IS A USER INTERRUPT FUNCTION WHICH IS RUN WHENEVER A MEMORY PROTECTION VIOLATION, WRITE INTO READ-ONLY MEMORY, ILLEGAL OPERATION, OR PARITY ERROR OCCURS. THE FUNCTION RECEIVES TWO ARGUMENTS: THE FIRST IS THE PROGRAM COUNTER WHEN THE ERROR OCCURRED (NOT THE MEMORY LOCATION OF THE ERROR!), AND THE SECOND IS A SYMBOL DESCRIBING THE TYPE OF ERROR: EXAMINE ATTEMPT TO REFERENCE NON-EXISTENT MEMORY DEPOSIT WRITE INTO READ-ONLY MEMORY EVAL ILLEGAL OPERATION ODDP PARITY ERROR NOTE THAT THE LISP SYSTEM MAY INTERCEPT SOME OCCURRENCES OF THESE ERRORS, SINCE THEY CAN BE USED FOR VARIOUS SHARED-MEMORY HACKS. IF THE USER INTERRUPT FUNCTION EVER RETURNS, THE PROGRAM IS RESUMED AT THE PROGRAM COUNTER AS OF THE ERROR; THAT IS, THE ERRONEOUS OPERATION IS RETRIED. BEWARE OF LOOPS! IT IS EXPECTED THAT THE INTERRUPT FUNCTION WILL NORMALLY ERROR OUT. IF NO USER INTERRUPT FUNCTION IS SUPPLIED, LISP WILL BEHAVE AS IT ALWAYS HAS, AND ERROR OUT TO TOP LEVEL. THE NEXT FEATURE IS AVAILABLE IN ALL BIBOP LISPS, WHETHER OLDIO OR NEWIO. [4] HUNKS PACKAGE THE HUNKS PACKAGE PROVIDES LISP WITH A KIND OF "RECORD" OR "SMALL VECTOR" FEATURE. THE HUNK DATA TYPE INTERACTS SMOOTHLY WITH THE LIST DATA TYPE TO PROVIDE SOME INTERESTING CAPABILITIES. [5A] A NEW DATA TYPE IS INTRODUCED INTO LISP, THE "HUNK". HUNKS ARE SHORT VECTORS OF S-EXPRESSIONS. IN THE CURRENT IMPLEMENTATION THERE ARE ACTUALLY SEVERAL SPACES OF FOR HUNKS, VARIOUSLY CALLED HUNK4, HUNK8, HUNK16, ETC. THESE WILL BE EXPLAINED IN DETAIL BELOW. IN SOME CONTEXTS ORDINARY LIST CELLS ARE CONSIDERED TO BE HUNKS OF LENGTH 2. HUNKS ARE NOT CONSIDERED TO BE ATOMS; (ATOM H) RETURNS NIL FOR ANY HUNK H. [5B] (HUNKP X) IS A PREDICATE WHICH RETURNS T IFF X IS A HUNK. IN THIS CONTEXT A LIST CELL IS NOT CONSIDERED TO BE A HUNK. (CXR N H) RETURNS THE N'TH ELEMENT OF THE HUNK H. (CXR 0 H) IS EQUIVALENT TO (CAR H), AND (CXR 1 H) IS EQUIVALENT TO (CDR H); IN FACT, THE CAR AND CDR FUNCTIONS MAY BE USED ON HUNKS AS WELL AS ON LISTS. (RPLACX N H Z) REPLACES THE N'TH COMPONENT OF H WITH Z. THE VALUE OF RPLACX IS ITS (MODIFIED) SECOND ARGUMENT. THUS (RPLACX 0 H Z) IS EQUIVALENT TO (RPLACA H Z), AND (RPLACX 1 H Z) IS EQUIVALENT TO (RPLACD H Z). (HUNK N) CREATES A HUNK OF SIZE N AND RETURNS IT. (HUNK 0) RETURNS NIL, AND (HUNK 1) OR (HUNK 2) RETURNS A LIST CELL. ALL COMPONENTS ARE INITIALIZED TO NIL. THE COMPONENTS ARE NUMBERED FROM 0 TO N-1. (HUNKIFY A0 A2 ... AN-1) IS EQUIVALENT TO ((LAMBDA (H) (RPLACX 0 A0) ... (RPLACX N-1 AN-1)) (HUNK N)) THAT IS, IT CREATES A HUNK WHOSE COMPONENTS ARE THE ARGUMENTS TO HUNKIFY. NOTE THAT, AS FUNNY BOUNDARY CASES, (HUNKIFY) RETURNS NIL, AND (HUNKIFY X) IS THE SAME AS (NCONS X). (HUNKSIZE H) RETURNS THE NUMBER OF COMPONENTS IN THE HUNK H. HUNKSIZE OF A LIST CELL IS 2; HUNKSIZE OF NIL IS 0. [5C] EQUAL WILL COMPARE HUNKS BY DOING A RECURSIVE COMPONENT BY COMPONENT COMPARISON. SXHASH WILL COMPUTE THE HASH ON THE BASIS OF ALL COMPONENTS. [5D] HUNKS ARE PRINTED USING AN EXTENSION TO DOT NOTATION SUGGESTED BY RMS. SINCE LIST CELLS ARE CONSIDERED TO BE 2-HUNKS, AND ARE PRINTED AS (CAR . CDR), THE RESULT OF (HUNKIFY A0 A1 A2 +++ AN-2 AN-1) IS PRINTED AS (A0 . A2 . A3 . +++ . AN-2 . AN-1 . A1), WHERE "+++" IS USED AS AN ELLIPSIS TO AVOID CONFUSION WITH THE DOT NOTATION. THUS WE HAVE: (HUNKIFY 0) => (0) (HUNKIFY 0 1) => (0 . 1) (HUNKIFY 0 1 2) => (0 . 2 . 1) (HUNKIFY 0 1 2 3) => (0 . 2 . 3 . 1) THE REASON FOR THE STRANGE PLACEMENT OF A1 IS SO THAT THE CDR WILL BE LAST. THIS MAY SEEM RATHER KLUDGY, BUT ACTUALLY LENDS ITSELF TO CERTAIN ELEGANT EXTENSIONS. ONE IS A GENERAL EXTENSION OF THIS DOT NOTATION TO LIST NOTATION. AS AN EXAMPLE, CONSIDER: (A B . C . D E . F G H I . J . K) THIS IS HOW PRINT WOULD REPRESENT THE RESULT OF: (HUNKIFY 'A (HUNKIFY 'B (HUNKIFY 'E (HUNKIFY 'G (HUNKIFY 'H (HUNKIFY 'I 'K 'J))) 'F) 'C 'D)) THE BASIC IDEA IS THAT CONSECUTIVE ITEMS SEPARATED BY DOTS ALL BELONG TO THE SAME HUNK; ITEMS SEPARATED ONLY BY SPACES BELONG TO DIFFERENT HUNKS, AND THE SECOND HUNK IS THE CDR (I.E. THE (CXR 1)) OF THE FIRST HUNK. ANOTHER WAY TO THINK ABOUT IT IS TO REPLACE THE TWO PARENS BY SUPER-BRACKETS, AND THEN BETWEEN TWO ITEMS SEPARATED BY SPACE BUT NOT DOT INSERT ".(". NOTE THAT THE DEFINITION OF (HUNKIFY X) AS (NCONS X) CAUSES THE BOUNDARY CONDITION AT THE END OF THE LIST TO WIN. AS A SPECIAL CASE, IF THE CDR OF A HUNK (OTHER THAN A LIST CELL) IS NIL, THAT NIL MAY BE ELIDED (BUT THE PRECEDING DOT MAY NOT BE ELIDED!). THUS: (HUNKIFY 1 (HUNKIFY 2 NIL 3 4) 5) => (1 . 5 2 . 3 . 4 .) (HUNKIFY 'A (HUNKIFY 'B (HUNKIFY 'C NIL 'D) 'E) 'F) => (A . F B . E C . D .) MAYBE EVENTUALLY READ WILL KNOW HOW TO READ THESE IN. [5E] MOST OTHER FUNCTIONS WHICH OPERATE ON LIST STRUCTURE WILL TREAT HUNKS AS LIST CELLS, USING ONLY THE FIRST TWO POINTERS. (IN PARTICULAR, SUBST AND SUBLIS DO NOT PRESENTLY KNOW ANYTHING SPECIAL ABOUT HUNKS; HENCE (SUBST NIL NIL H) WILL NOT COPY A HUNK!) EVAL ALSO TREATS HUNKS AS LIST CELLS; THUS THE EXPRESSION (PLUS . FIXNUM . SIMP 1 2 3) EVALUATES TO 6, IGNORING "FIXNUM" AND "SIMP". IMAGINE THE POSSIBILITIES FOR HACKING! [5F] (STATUS FEATURE HUNK) IS NON-NIL IFF LISP HAS THE HUNK STUFF. [5G] (STATUS SPCNAMES) WILL INCLUDE THE NAMES OF ALL THE ACTUAL SPACES. IN THE CURRENT IMPLEMENTATION HUNKS HAVE SPACES FOR HUNKS OF VARIOUS POWERS OF TWO IN SIZE, NAMELY 4., 8., 16., ... UP TO SOME LIMIT (PROBABLY 16., THOUGH IT IS AN ASSEMBLY PARAMETER I CAN CHANGE IF ANYONE NEEDS IT). A HUNK OF 11. POINTERS IS MADE USING ONE OF 16. POINTERS AND MARKING 5. OF THEM AS UNUSED. IT IS PROBABLY NOT A GOOD IDEA TO DEPEND ON THIS IMPLEMENTATION, AS ONE CAN IMAGINE MORE HACKISH IMPLEMENTATIONS (BUDDY BLOCK, ETC.). [5H] (STATUS GCSIZE), (STATUS GCMAX), (ALLOC T), AND SIMILAR HACKS ALL KNOW ABOUT THE SPACE NAMES FOR HUNKS AS RETURNED BY (STATUS SPCNAMES). THIS LAST MESS IS IN NEWIO ONLY! [I] HUMBLE PACKAGE FOR HACKING INFERIOR JOBS ON ITS LIBLSP;HUMBLE FASL CONTAINS A COLLECTION OF PRIMITIVES FOR HACKING INFERIOR JOBS FROM LISP. SOME LESS PRIMITIVE PACKAGES WHICH USE HUMBLE ALSO EXIST; JLK IS A GOOD PERSON TO ASK. [I1] THE FOLLOWING SPECIAL VARIABLES ARE SACRED TO HUMBLE: CURRENT-JOB THE-JOB-INPUT-CHANNEL THE-JOB-OUTPUT-CHANNEL THE-JOB-INPUT-CHANNEL-FILE-OBJECT THE-JOB-OUTPUT-CHANNEL-FILE-OBJECT THE USER OF HUMBLE NEED CONCERN HIMSELF ONLY WITH CURRENT-JOB. IF NON-NIL, THIS IS THE JOB OBJECT FOR THE CURRENT JOB. HUMBLE USES TWO I/O CHANNELS, WHICH ARE USED TO SERVE THE CURRENT JOB. JOB OBJECTS ARE SIMILAR TO NEWIO FILE OBJECTS. THEIR FORMAT IS DOCUMENTED (AND SYMBOLS DEFINED) IN LISP;DEFNS >. HUMBLE AND LISP MAINTAIN INTERNALLY A TABLE OF JOB OBJECTS (KEPT AT LOCATION JOBTB). IF A JOB OBJECT IS EVER GARBAGE COLLECTED, GC PRINTS A MESSAGE AND .UCLOSE'S THE JOB. [I2] (CREATE-JOB ) CREATES A JOB OBJECT, AND MAKES IT CURRENT. AND ARE THE INTERRUPT FUNCTIONS TO BE USED IF AN INTERRUPT IS RECEIVED ON THE INFERIOR OR ON THE I/O CHANNELS USED TO SERVICE INFERIORS, RESPECTIVELY. THEY RECEIVE ONE ARGUMENT, THE JOB OBJECT OR FILE OBJECT ASSOCIATED WITH THE INTERRUPT. AND ARE OPTIONAL ARGUMENTS. = NIL (DEFAULT) MEANS YOUR UNAME. = T (NON-DEFAULT) MEANS REQUIRE FOREIGN JOB. CREATE-JOB RETURNS A LIST OF TWO THINGS: (1) ONE OF THE FOLLOWING ATOMS: INFERIOR, REOWNED, FOREIGN (2) THE NEWLY CREATED JOB OBJECT IF WAS NON-NIL AND THE JOB WAS NOT FOUND, NIL IS RETURNED. [I3] (SELECT-JOB ) MAKES THE SPECIFIED JOB CURRENT IN THE EXPECTED MODE (FOREIGN OR NOT), RETURNING VALUES AS FOR CREATE-JOB. [I4] (KILL-JOB) KILLS THE CURRENT JOB. [I5] (LOAD-JOB ) OPENS UP FILE (SPECIFIED AS A NEWIO NAMELIST OR NAMESTRING) AND LOADS IT INTO TH CURRENT JOB AS A BINARY PROGRAM (USES THE LOAD SYSTEM CALL). RETURNS: NIL WON! BIN? FILE NOT BIN FILE? FILE NOT FOUND [I6] (JOB-USET-READ ) RETURNS VALUE OF USET VAR , OR NIL IF NO CURRENT JOB. (JOB-USET-WRITE ) WRITES USET VAR , THEN RETURNS T FOR SUCCESS OR NIL IF NO CURRENT JOB OR THE CURRENT JOB IS FOREIGN. SHOULD HAVE THE 400000 BIT SET. [I7] (EXAMINE-JOB ) EXAMINES LOCATION OF CURRENT JOB. RETURNS NIL ON FAILURE (INDICATES BAD ERROR). (DEPOSIT-JOB ) DEPOSITS IN OF CURRENT JOB. RETURNS NIL ON FAILURE (INDICATES BAD ERROR). [I8] (*ATTY) DOES A .ATTY TO THE CURRENT JOB; (*DTTY) DOES A .DTTY. BOTH RETURN T FOR SUCCESS AND NIL FOR FAILURE. [I9] THERE EXIST PACKAGES OF MACROS AND HIGHER-LEVEL FUNCTIONS FOR HACKING INFERIOR JOBS. SEE JLK OR RZ FOR IDEAS. MONDAY, MARCH 22,1976 FM+6D.22H.2M.17S. LISP 1130 - GLS & JONL - [1] (STATUS XUNAME) AND (STATUS XJNAME) NOW EXIST. [2] FUNNY FORMAT DEFUN ALLOWS ARBITRARY PROPERTY NAMES [3] PRIN1 DOES VERTICAL BAR AND LOOKAHEAD CLEVERNESS [4] BREAK MAY TAKE ONE ARGUMENT, DEFAULTING THE SECOND TO T [5] VALUE OF $P IS THE $P ATOM (NIL => NONE) [6] *NOPOINT CONTROLS OUTPUT OF LEADING SUPRA-DECIMAL + THE FOLLOWING CHANGES APPLY TO NEWIO ONLY: [A] OPENI, OPENO, OPENA HAVE GONE AWAY [B] (STATUS FILEMODE) RETURNS NIL IF GIVEN A CLOSED FILE. [C] CLI-MESSAGE INTERRUPT HANDLER [D] NEW FUNCTIONS: ALLFILES AND FRIENDS [E] WHO-LINE STATUS CALLS [F] (STATUS TTYTYPE ) RETURNS TCTYP [G] EXAMPLES OF KEYBOARD PRE-SCAN FUNCTIONS ---------------------------------------------------------------- [1] (STATUS XUNAME) AND (STATUS XJNAME) WERE ADDED AS AN AUGMENTATION TO (STATUS UNAME) AND (STATUS JNAME). [2] THE "FUNCTION NAME" IN A DEFUN FORM MAY BE A 3-LIST; THE FIRST ELEMENT IS THE NAME, THE SECOND THE "EXPR" PROPERTY NAME, AND THE THIRD THE "SUBR" PROPERTY NAME. THAT IS, INSTEAD OF USING THE PROPERTY NAME "EXPR" (OR "FEXPR"), THE INTERPRETER WILL USE THE PROPERTY NAME WHICH IS THE SECOND ELEMENT, AND THE COMPILER WILL USE THAT WHICH IS THE THIRD NAME. THE TYPE OF THE FUNCTION IS STILL DETERMINED BY THE OPTIONAL FLAG "FEXPR" AND WHETHER THE LAMBDA VARIABLE LIST IS ATOMIC. EXAMPLE: (DEFUN (FOO QEXPR QSUBR) (A B) ...) IN THE INTERPRETER PUTS A LAMBDA EXPRESSION UNDER THE "QEXPR" PROPERTY OF "FOO", AND IN THE COMPILER COMPILES A SUBR OF TWO ARGUMENTS HEADED BY THE LAP STATEMENT (LAP FOO QSUBR) INSTEAD OF (LAP FOO SUBR). [3] MOSTLY FOR AESTHETIC REASONS, PRIN1 IS NOW MORE CLEVER ABOUT PRINTING ATOMS: (A) IF PRIN1 THINKS VERTICAL BARS WILL LOOK NICER THAN SLASHES, IT WILL USE THEM. (B) IF IT LOOKS LIKE THE NEXT ATOM TO PRINT WILL NOT FIT ON THE LINE, PRIN1 TRIES TO GET A TERPRI IN BEFORE THE ATOM, THUS AVOIDING SPLITTING AN ATOM ACROSS A NEWLINE. THESE HEURISTICS MAY BECOME EVEN MORE CLEVER IN THE FUTURE. PRINC DOES NOT USE ANY OF THESE HACKS. FLATSIZE USES THE FIRST, BUT NOT THE SECOND. [4] THE FORM (BREAK FOO) IS NOW THE SAME AS (BREAK FOO T). [5] THE BREAK LOOP NO LONGER LOOKS FOR THE ATOM P. INSTEAD, IT LOOKS FOR THE ATOM WHICH IS THE VALUE OF THE ATOM P, WHICH IS INITIALLY SET TO 'P, SO IT WORKS AS BEFORE BHY DEFAULT. IF P IS NIL, THEN NO ATOM WILL SERVE THE P FUNCTION. [6] IF BASE IS GREATER THAN 10., *NOPOINT IF NON-NIL WILL SUPPRESS THE + WHICH NORMALLY PRECEDES POSITIVE SUPRA-DECIMAL NUMBERS. FOR BASE = 10., *NOPOINT STILL SUPPRESSES THE TRAILING DECIMALLL POINT. THE FOLLOWING CHANGES APPLY TO NEWIO ONLY: [A] OPENI, OPENO, OPENA HAVE GONE AWAY. USE OPEN WITH THE "IN", "OUT", OR "APPEND" OPTION IN THE SECOND ARGUMENT. [B] (STATUS FILEMODE ) RETURNS NIL FOR A CLOSED FILE. FOR OPEN FILES, IT OPERATES AS IT ALWAYS HAS. FOR A NON-FILE, IT GIVES A WRNG-TYPE-ARG ERROR. [C] THE ATOM "CLI-MESSAGE" HAS AS ITS VALUE THE USER INTERRUPT FUNCTION FOR THE CLI DEVICE INTERRUPT. THE FUNCTION GETS A SINGLE ARGUMENT OF NIL. IT SHOULD OPEN THE "CLA:" DEVICE IN RESPONSE TO THE INTERRUPT IN ORDER TOP READ THE MESSAGE. ONE OF THE OPTIONS IN OPEN'S SECOND ARGUMENT SHOULD BE "CLA" (AS OPPOSED TO "DSK" OR "TTY"); THIS CAUSES OPEN TO READ THE FIRST TWO WORDS OF THE FILE AND USE THEM AS THE FILE NAMES FOR THE TRUENAME FUNCTION. THE CLA: FILE SHOULD BE OPENED IN BLOCK MODE FOR THIS PURPOSE. THE DEFAULT CLI-MESSAGE FUNCTION IS NIL, I.E. IGNORE THE INTERRUPTS. [D] FOUR NEW FUNCTIONS (AUTOLOADABLE) NOW EXIST FOR LOOKING AT FILE DIRECTORIES: ALLFILES, DIRECTORY, MAPALLFILES, AND MAPDIRECTORY. (ALLFILES X) TAKES A LIST OF NAMELISTS (AND NAMESTRINGS) X AND RETURNS A LIST OF NAMELISTS IN THE FILE SYSTEM WHICH MATCH ELEMENTS OF X. THERE IS NO GUARANTEE AS TO THE ORDERING OF THE FILES IN THE RETURNED LIST. IF A SORTED LIST IS DESIRED, THE SORTCAR FUNCTION SHOULD BE USED WITH AN APPROPRIATE PREDICATE. NOTE WELL THAT X IS A *LIST* OF NAMELISTS, AND NOT JUST A SINGLE NAMELIST; THIS IS AN INCOMPATIBILITY WITH THE ALLFILES FUNCTION DESCRIBED IN THE MOONUAL. EXAMPLE: (ALLFILES '(|GLS;ALLFIL| ((DSK TGQ) * SONG) |* BIN|)) RETURNS DESCRIPTORS FOR ALL FILES ON GLS'S DIRECTORY WITH FIRST NAME "ALLFIL", ALL SONGS ON TGQ, AND ALL DSK FILES IN ANY DIRECTORY WITH SECOND NAME "BIN". (DIRECTORY X) IS LIKE (ALLFILES X), BUT INSTEAD OF NAMELISTS IT RETURNS A LIST OF FILE DESCRIPTORS, WHERE EACH DESCRIPTOR HAS A NAMELIST IN THE CAR AND A PROPERTY LIST IN THE CDR. TYPICAL PROPERTIES ARE: WORDS SIZE OF FILE IN PDP-10 WORDS CHARACTERS SIZE OF FILE IN ASCII CHARACTERS BITS SIZE IN BITS (TO BE IMPLEMENTED WHEN ITS SUPPORTS IT) CREDATE DATE OF CREATION CRETIME TIME OF CREATION REFDATE DATE OF MOST RECENT REFERENCE LINK NAME LINKED TO PACK PACK NUMBER UNDUMPED T IF FILE NOT YET BACKED UP ON MAGTAPE NOREAP T IF NO REAP BIT IS SET (DIRECTORY X PROPS) IS SIMILAR, BUT INCLUDES ONLY THE PROPERTIES MENTIONED IN "PROPS" FOR EFFICIENCY. AS A SPECIAL CASE, OMITTING "LINK" CAUSES LINKS NOT TO BE INCLUDED AT ALL. (MAPALLFILES FN X) IS LIKE (MAPC FN (ALLFILES X)) BUT DOESN'T HAVE TO CONS UP THE WHOLE LIST AT ONCE. (MAPDIRECTORY FN X) AND (MAPDIRECTORY FN X PROPS) ARE SIMILAR. MATCHING: AT PRESENT, THE ONLY MATCHING CAPABILITIES IN ALLFILES ARE DIRECT NAME EQUALITY AND *, WHICH MATCHES ANYTHING. * AS A DEVICE NAME IMPLIES DSK. * AS A DIRECTORY NAME USES ALL DIRECTORIES FOR DSK, AND THE DEFAULT DIRECTORY FOR ALL OTHER DEVICES. IN THIS CONTEXT, AI, ML, MC, AND DM ARE *NOT* CONSIDERED TO BE DSK DEVICES; BUT IN OTHER CONTEXTS THEY ARE. [E] (SSTATUS WHO1 A B C D) SETS THE .WHO1 USER VARIABLE TO <.BYTE 8 ? A ? B ? C ? D> IN MIDAS TERMINOLOGY. A AND C MUST BE FIXNUMS; B AND D MUST BE FIXNUMS WITH ASCII VALUES, OR CHARACTER OBJECTS. (SSTATUS WHO2 X) AND (SSTATUS WHO3 X) SET THE .WHO2 AND .WHO3 USER VARIABLES. X MAY BE A FIXNUM OR A SYMBOL; IN THE LATTER CASE THE FIRST SIX CHARACTERS ARE USED TO FORM A SIXBIT WORD. THE .WHON USER VARIABLES CAUSE INFORMATION TO BE DISPLAYED IN THE TERMINAL'S WHO-LINE. THE MEANING OF A, B, C, AND D IS AS FOLLOWS: VAR BITS MEANING A 200 IF 1, SUPPRESS ENTIRE WHO-LINE 100 SUPPRESS SPACE BETWEEN HALVES OF .WHO2 70 MODE FOR PRINTING LEFT HALF OF .WHO2 0 DO NOT PRINT 1 DATE IN PACKED FORM: 774000 YEAR MOD 100. 3600 MONTH (1=JANUARY) 174 DAY OF MONTH 2 TIME IN FORTIETHS OF A SECOND, PRINTED AS HH:MM:SS.T 3 TIME IN HALF-SECONDS, PRINTED AS HH:MM:SS 4 OCTAL HALFWORD 5 DECIMAL HALFWORD (NO . SUPPLIED) 6 THREE SIXBIT CHARACTERS 7 UNUSED 7 MODE FOR RIGHT HALF OF .WHO2 B 177 IF NON-ZERO, PRINT BETWEEN HALVES OF .WHO2 AS AN ASCII CHARACTER 200 IF 1, PRINT CHAR TWICE C 200 IF 1, SUPPRESS SPACE BETWEEN .WHO2 PRINTOUT AND .WHO3 PRINTOUT OTHERWISE LIKE A, BUT FOR .WHO3. D LIKE B, BUT FOR .WHO3. THAT IS, IF THE WHO-LINE IS PRINTED AT ALL, WHAT APPEARS AT THE END IS THE CHARACTERS: IIIIXX-JJJJ=KKKKYY+LLLL WHERE: IIII IS THE RESULT OF PRINTING THE LEFT HALF OF .WHO2 AS SPECIFIED BY A'S 70 BITS. JJJJ RIGHT HALF OF .WHO2, BY A'S 7 BITS. KKKK LEFT HALF OF .WHO3, BY C'S 70 BITS. LLLL RIGHT HALF OF .WHO3, BY C'S 7 BITS. XX ZERO TO TWO CHARACTERS, SPECIFIED BY B. YY ZERO TO TWO CHARACTERS, SPECIFIED BY D. - SPACE, UNLESS A'S 100 BIT IS 1. = SPACE, UNLESS C'S 200 BIT IS 1. + SPACE, UNLESS C'S 100 BIT IS 1. EXAMPLE: (SSTATUS WHO1 166 0 144 '/!) (SSTATUS WHO2 'FOOBAR) (SSTATUS WHO3 (+ (LSH 1234 22) 3456)) CAUSES "FOOBAR 1234!5678" TO APPEAR IN THE WHO-LINE. THE STATUS FORMS ARE AS FOLLOWS: (STATUS WHO1) RETURNS A LIST OF FOUR FIXNUMS. (STATUS WHO2) AND (STATUS WHO3) RETURN FIXNUMS. [F] (STATUS TTYTYPE ) RETURNS THE TCTYP VARIABLE FOR THE SPECIFIED OUTPUT TTY (IF OMITTED, THIS DEFAULTS TO T, THE STANDARD OUTPUT TTY). THIS IS THE EXTENSION IN NEWIO TO OLDIO'S SETTING OF THE VARIABLE "TTY". FOR COMPATIBILITY, WHEN IT STARTS UP, NEWIO LISP DOES (SETQ TTY (STATUS TTYTYPE T)). POSSIBLE VALUES ARE: 0 PRINTING CONSOLE 1 GOOD DATAPOINT 2 "LOSER" DATAPOINT 3 IMLAC 4 TEKTRONIX 4000 SERIES (FORMERLY ARDS) 5 PDP-11 (KNIGHT) TV DISPLAY 6 MEMOREX (FORMERLY HORIZONTAL ARDS) 7 SOFTWARE TTY 10 TERMINET 11 TTY USING ASCII STANDARD DISPLAY SEQUENCES IN GENERAL, IT IS BETTER NOT TO USE THIS STATUS FUNCTION, BUT RATHER TO SAY (STATUS FILEMODE ) AND LOOK FOR FLAGS SUCH AS "RUBOUT" AND "CURSORPOS". [G] EXAMPLES OF KEYBOARD PRE-SCAN FUNCTIONS. (1) THE KEYBOARD PRE-SCAN FUNCTION IS THE ONE SET BY (SSTATUS TTYSCAN ...). IT IS THE FUNCTION WHICH HANDLES RUBOUT AND ^L PROCESSING. AS AN EXAMPLE, THE FUNCTION GIVEN HERE IS A VERY CLOSE APPROXIMATION TO THE DEFAULT PROVIDED BY LISP. ------------------------------------------------------------ SAMPLE TTY PRESCAN FUNCTION -- APPROXIMATELY THE ONE IN LISP ------------------------------------------------------------ (DECLARE (MAPEX)) (DEFUN CONSTANT MACRO (X) (LIST 'DEFUN (CADR X) 'MACRO '(X) (LIST 'QUOTE (CADDR X)))) (DEFUN LOGAND MACRO (X) (CONS 'BOOLE (CONS '1 (CDR X)))) (DEFUN LOGOR MACRO (X) (CONS 'BOOLE (CONS '7 (CDR X)))) (DEFUN LOGCLR MACRO (X) (CONS 'BOOLE (CONS '4 (CDR X)))) (DEFUN PUSH MACRO (X) (LIST 'SETQ (CADDR X) (LIST 'CONS (CADR X) (CADDR X)))) (DEFUN POP MACRO (X) (LIST 'PROG2 NIL (LIST 'CAR (CADR X)) (LIST 'SETQ (CADR X) (LIST 'CDR (CADR X))))) (CONSTANT TOP 4000) ;NAMES OF BITS FOR KNIGHT KEYBOARDS (CONSTANT SHIFTLOCK 2000) (CONSTANT SHIFT 1000) (CONSTANT META 400) (CONSTANT CTRL 200) (CONSTANT ASCII-BITS 177) (CONSTANT ^K 13) ;VARIOUS ASCII CHARACTERS (CONSTANT ^L 14) (CONSTANT ^M 15) (CONSTANT SPACE 40) (CONSTANT OPEN-PAREN 50) (CONSTANT VERTICAL-BAR 174) (CONSTANT PSEUDOSPACE 203) ;A FAKE SPACE (INTERNAL TO LISP) (CONSTANT SLASH-SYNTAX 2000) ;BITS IN READER SYNTAX TABLE (CONSTANT ALTERNATE-SYNTAX 40) (CONSTANT OPEN-SYNTAX 40000) (CONSTANT CLOSE-SYNTAX 10000) (CONSTANT RUBOUT-SYNTAX 1000) (CONSTANT FORCE-FEED 1000) ;WITH ALTERNATE-SYNTAX (CONSTANT SPACE-SYNTAX 100000) (CONSTANT SINGLE-SYNTAX 200000) (CONSTANT MACRO-SYNTAX 4000) (CONSTANT WORTHY-SYNTAX 277237) ;"WORTHY" CHARACTERS (CONSTANT SLASH-FLAG 400000) (CONSTANT STRING-BEGIN-FLAG 200000) (CONSTANT STRING-END-FLAG 100000) (DEFUN TYI7 (IFILE) ((LAMBDA (CH) (COND ((ZEROP (LOGAND (CTRL) CH)) CH) ((= CH (+ (CTRL) 177)) 177) (T (LOGAND CH 37)))) (LOGCLR (TYI IFILE) (LOGOR (TOP) (SHIFTLOCK) (SHIFT) (META))))) (DEFUN REPRINT (CHARS COUNT POS OFILE) (DECLARE (FIXNUM COUNT)) (COND (OFILE (AND POS (CURSORPOS (CAR POS) (CDR POS) OFILE)) (AND (PLUSP COUNT) (DO ((I 0 (1+ I))) ((= I COUNT) (TYO (SPACE) OFILE)) (DECLARE (FIXNUM I)) (TYO (OPEN-PAREN) OFILE))) (MAPCAR '(LAMBDA (CH) (TYO (LOGAND CH (ASCII-BITS)) OFILE)) CHARS)))) (DEFUN TTY-PRESCAN (IFILE FN PARENSCOUNT) (DECLARE (FIXNUM PARENSCOUNT)) (PROG (USEFUL STARTPOS OFILE STRING-END BUFFER CH SYNTAX LINMODE TTYREAD COUNT) (DECLARE (FIXNUM STRING-END CH SYNTAX COUNT)) (AND (SETQ OFILE (STATUS TTYCONS IFILE)) (SETQ STARTPOS (CURSORPOS OFILE))) (SETQ LINMODE (STATUS LINMODE IFILE)) (SETQ TTYREAD (STATUS TTYREAD IFILE)) (SETQ COUNT PARENSCOUNT) (SETQ STRING-END -1) LOOP (SETQ SYNTAX (STATUS SYNTAX (SETQ CH (TYI7 IFILE)))) (COND ((= CH (^M)) (COND ((EQ FN 'READLINE) (GO DONE)) (LINMODE (OR (MINUSP STRING-END) (PUSH (PSEUDOSPACE) BUFFER)) (GO DONE))))) (COND ((OR (= CH (^K)) (= CH (^L))) (COND ((NULL OFILE) (GO LOOP)) (T (COND ((AND (= CH (^L)) STARTPOS) (CURSORPOS 'C OFILE)) (T (TERPRI OFILE))) (SETQ STARTPOS (CURSORPOS OFILE)) (REPRINT (REVERSE BUFFER) PARENSCOUNT NIL OFILE) (GO LOOP)))) ((AND (NOT (EQ FN 'READLINE)) (PLUSP (LOGAND SYNTAX (SLASH-SYNTAX)))) (PUSH CH BUFFER) (PUSH (LOGOR (SLASH-FLAG) (TYI7)) BUFFER) (SETQ USEFUL T) (GO LOOP)) ((AND (PLUSP (LOGAND SYNTAX (RUBOUT-SYNTAX))) (ZEROP (LOGAND SYNTAX (ALTERNATE-SYNTAX)))) (COND (BUFFER (AND OFILE (OR (RUBOUT (LOGCLR (SETQ CH (POP BUFFER)) (LOGOR (SLASH-FLAG) (STRING-BEGIN-FLAG) (STRING-END-FLAG))) OFILE) (REPRINT (REVERSE BUFFER) PARENSCOUNT STARTPOS OFILE))) (COND ((PLUSP (LOGAND CH (SLASH-FLAG))) (AND OFILE (OR (RUBOUT (POP BUFFER) OFILE) (REPRINT (REVERSE BUFFER) PARENSCOUNT STARTPOS OFILE)))) ((NOT (MINUSP STRING-END)) (AND (PLUSP (LOGAND CH (STRING-BEGIN-FLAG))) (SETQ STRING-END -1))) ((PLUSP (LOGAND CH (STRING-END-FLAG))) (SETQ STRING-END (LOGAND CH (ASCII-BITS)))) ((PLUSP (LOGAND (SETQ SYNTAX (STATUS SYNTAX (LOGCLR CH (LOGOR (SLASH-FLAG) (STRING-BEGIN-FLAG) (STRING-END-FLAG))))) (OPEN-SYNTAX))) (SETQ COUNT (- COUNT 1))) ((PLUSP (LOGAND SYNTAX (CLOSE-SYNTAX))) (SETQ COUNT (+ COUNT 1))))) (T (AND OFILE (TERPRI OFILE)))) (GO LOOP)) ((EQ FN 'READLINE) (PUSH CH BUFFER) (GO LOOP)) ((NOT (MINUSP STRING-END)) (COND ((= CH STRING-END) (PUSH (LOGOR CH (STRING-END-FLAG)) BUFFER) (SETQ STRING-END -1)) (T (PUSH CH BUFFER))) (GO LOOP)) ((AND (PLUSP (LOGAND SYNTAX (FORCE-FEED))) (PLUSP (LOGAND SYNTAX (ALTERNATE-SYNTAX)))) (GO DONE)) ((PLUSP (LOGAND SYNTAX (SPACE-SYNTAX))) (COND ((OR (PLUSP COUNT) (NOT USEFUL) LINMODE (NOT TTYREAD)) (PUSH CH BUFFER) (GO LOOP)) (T (GO DONE)))) ((PLUSP (LOGAND SYNTAX (SINGLE-SYNTAX))) (COND ((OR (PLUSP COUNT) LINMODE (NOT TTYREAD)) (SETQ USEFUL T) (PUSH CH BUFFER) (GO LOOP)) (T (GO DONE)))) ((PLUSP (LOGAND SYNTAX (MACRO-SYNTAX))) ((LAMBDA (MAC) (COND ((EQ MAC '+INTERNAL-/;-MACRO) (PUSH (LOGOR CH (STRING-BEGIN-FLAG)) BUFFER) (SETQ STRING-END (^M))) ((EQ MAC '+INTERNAL-/|-MACRO) (PUSH (LOGOR CH (STRING-BEGIN-FLAG)) BUFFER) (SETQ STRING-END (VERTICAL-BAR))) (T (PUSH CH BUFFER)))) (CAR (STATUS MACRO (+ CH 0)))) (SETQ USEFUL T) (GO LOOP)) ((PLUSP (LOGAND SYNTAX (OPEN-SYNTAX))) (SETQ COUNT (+ COUNT 1)) (SETQ USEFUL T) (PUSH CH BUFFER) (GO LOOP)) ((PLUSP (LOGAND SYNTAX (CLOSE-SYNTAX))) (COND ((OR (PLUSP COUNT) (NOT USEFUL) LINMODE (NOT TTYREAD)) (COND ((PLUSP (SETQ COUNT (- COUNT 1))) (PUSH CH BUFFER) (GO LOOP)) (T (GO DONE)))) (T (GO DONE)))) ((PLUSP (LOGAND SYNTAX (WORTHY-SYNTAX))) (PUSH CH BUFFER) (SETQ USEFUL T) (GO LOOP)) (T (PUSH CH BUFFER) (GO LOOP))) DONE (AND OFILE ((LAMBDA (POS) (LINENUM OFILE (CAR POS)) (CHARPOS OFILE (CDR POS))) (CURSORPOS OFILE))) (PUSH CH BUFFER) (SETQ BUFFER (NREVERSE BUFFER)) (MAP '(LAMBDA (X) (AND (PLUSP (LOGAND (CAR X) (LOGOR (SLASH-FLAG) (STRING-BEGIN-FLAG) (STRING-END-FLAG)))) (RPLACA X (LOGCLR (CAR X) (LOGOR (SLASH-FLAG) (STRING-BEGIN-FLAG) (STRING-END-FLAG)))))) BUFFER) (RETURN BUFFER))) AS AN EXAMPLE OF HOW YOU MIGHT CHANGE THIS, HERE IS A SLIGHT MODIFICATION TO GIVE ONE THE "PARENS BALANCE WINDOW" PROPOSED BY GREENBLATT: ------------------------------------------------- TTY PRESCAN FUNCTION WITH PARENS BALANCING WINDOW ------------------------------------------------- (DECLARE (ARGS 'CURSORPOS '(0 . 3)) (SPECIAL IFILE OFILE) (DEFPROP TTYRE A STATUS) (DEFPROP TTYSI A STATUS) (DEFPROP TTYCO A STATUS) (DEFPROP LINMO A STATUS)) ;FIX NCOMPL BUGS (DECLARE (MAPEX T) (NEWIO T)) (DEFUN CONSTANT MACRO (X) (LIST 'DEFUN (CADR X) 'MACRO '(X) (LIST 'QUOTE (CADDR X)))) (DEFUN LOGAND MACRO (X) (CONS 'BOOLE (CONS '1 (CDR X)))) (DEFUN LOGOR MACRO (X) (CONS 'BOOLE (CONS '7 (CDR X)))) (DEFUN LOGCLR MACRO (X) (CONS 'BOOLE (CONS '4 (CDR X)))) (DEFUN PUSH MACRO (X) (LIST 'SETQ (CADDR X) (LIST 'CONS (CADR X) (CADDR X)))) (DEFUN POP MACRO (X) (LIST 'PROG2 NIL (LIST 'CAR (CADR X)) (LIST 'SETQ (CADR X) (LIST 'CDR (CADR X))))) (CONSTANT TOP 4000) ;NAMES OF BITS FOR KNIGHT KEYBOARDS (CONSTANT SHIFTLOCK 2000) (CONSTANT SHIFT 1000) (CONSTANT META 400) (CONSTANT CTRL 200) (CONSTANT ASCII-BITS 177) (CONSTANT ^K 13) ;VARIOUS ASCII CHARACTERS (CONSTANT ^L 14) (CONSTANT ^M 15) (CONSTANT SPACE 40) (CONSTANT OPEN-PAREN 50) (CONSTANT VERTICAL-BAR 174) (CONSTANT PSEUDOSPACE 203) ;A FAKE SPACE (INTERNAL TO LISP) (CONSTANT SLASH-SYNTAX 2000) ;BITS IN READER SYNTAX TABLE (CONSTANT ALTERNATE-SYNTAX 40) (CONSTANT OPEN-SYNTAX 40000) (CONSTANT CLOSE-SYNTAX 10000) (CONSTANT RUBOUT-SYNTAX 1000) (CONSTANT FORCE-FEED 1000) ;WITH ALTERNATE-SYNTAX (CONSTANT SPACE-SYNTAX 100000) (CONSTANT SINGLE-SYNTAX 200000) (CONSTANT MACRO-SYNTAX 4000) (CONSTANT WORTHY-SYNTAX 277237) ;"WORTHY" CHARACTERS (CONSTANT SLASH-FLAG 400000) (CONSTANT STRING-BEGIN-FLAG 200000) (CONSTANT STRING-END-FLAG 100000) (DECLARE (FIXNUM (TYI7 NIL))) (DEFUN TYI7 (IFILE) ((LAMBDA (CH) (COND ((ZEROP (LOGAND (CTRL) CH)) CH) ((= CH (+ (CTRL) 177)) 177) (T (LOGAND CH 37)))) (LOGCLR (TYI IFILE) (LOGOR (TOP) (SHIFTLOCK) (SHIFT) (META))))) (DEFUN REPRINT (CHARS COUNT POS OFILE) (DECLARE (FIXNUM COUNT)) (COND (OFILE (AND POS (CURSORPOS (CAR POS) (CDR POS) OFILE)) (AND (PLUSP COUNT) (DO ((I 0 (1+ I))) ((= I COUNT) (TYO (SPACE) OFILE)) (DECLARE (FIXNUM I)) (TYO (OPEN-PAREN) OFILE))) (MAPCAR '(LAMBDA (CH) (TYO (LOGAND CH (ASCII-BITS)) OFILE)) CHARS)))) (DEFUN PROMPTER (BUFFER SIZE OFILE) (AND OFILE ((LAMBDA (CHARS POS HAUMANY) (CURSORPOS 0 (- (CDR SIZE) HAUMANY 5) OFILE) (CURSORPOS 'L OFILE) (DO ((I 0 (1+ I)) (L CHARS (CDR L))) ((OR (NULL L) (= (CAR L) (^M)) (= I HAUMANY))) (DECLARE (FIXNUM I)) (TYO (LOGAND (CAR L) (ASCII-BITS)))) (CURSORPOS (CAR POS) (CDR POS) OFILE)) (DO ((X BUFFER (CDR X)) (N 0 ((LAMBDA (SYNTAX) (COND (STRING N) ((PLUSP (LOGAND SYNTAX (OPEN-SYNTAX))) (- N 1)) ((PLUSP (LOGAND SYNTAX (CLOSE-SYNTAX))) (+ N 1)) (T N))) (STATUS SYNTAX (LOGAND (CAR X) (ASCII-BITS))))) (STRING NIL (COND ((PLUSP (LOGAND (CAR X) (STRING-BEGIN-FLAG))) NIL) ((PLUSP (LOGAND (CAR X) (STRING-END-FLAG))) T) (T STRING))) (CHARS NIL (CONS (CAR X) CHARS))) ((OR (MINUSP N) (NULL X)) CHARS) (DECLARE (FIXNUM N))) (CURSORPOS OFILE) (// (CDR SIZE) 2)))) (DEFUN TTY-PRESCAN (IFILE FN PARENSCOUNT) (DECLARE (FIXNUM PARENSCOUNT)) (PROG (USEFUL STARTPOS OFILE STRING-END BUFFER CH SYNTAX LINMODE TTYREAD COUNT SIZE) (DECLARE (FIXNUM STRING-END CH SYNTAX COUNT)) (COND ((SETQ OFILE (STATUS TTYCONS IFILE)) (SETQ STARTPOS (CURSORPOS OFILE)) (SETQ SIZE (STATUS TTYSIZE OFILE)))) (SETQ LINMODE (STATUS LINMODE IFILE)) (SETQ TTYREAD (STATUS TTYREAD IFILE)) (SETQ COUNT PARENSCOUNT) (SETQ STRING-END -1) LOOP (SETQ SYNTAX (STATUS SYNTAX (SETQ CH (TYI7 IFILE)))) (COND ((= CH (^M)) (COND ((EQ FN 'READLINE) (GO DONE)) (LINMODE (OR (MINUSP STRING-END) (PUSH (PSEUDOSPACE) BUFFER)) (GO DONE))))) (COND ((OR (= CH (^K)) (= CH (^L))) (COND ((NULL OFILE) (GO LOOP)) (T (COND ((AND (= CH (^L)) STARTPOS) (CURSORPOS 'C OFILE)) (T (TERPRI OFILE))) (SETQ STARTPOS (CURSORPOS OFILE)) (REPRINT (REVERSE BUFFER) PARENSCOUNT NIL OFILE) (PROMPTER BUFFER SIZE OFILE) (GO LOOP)))) ((AND (NOT (EQ FN 'READLINE)) (PLUSP (LOGAND SYNTAX (SLASH-SYNTAX)))) (PUSH CH BUFFER) (PUSH (LOGOR (SLASH-FLAG) (TYI7 IFILE)) BUFFER) (SETQ USEFUL T) (GO LOOP)) ((AND (PLUSP (LOGAND SYNTAX (RUBOUT-SYNTAX))) (ZEROP (LOGAND SYNTAX (ALTERNATE-SYNTAX)))) (COND (BUFFER (AND OFILE (OR (RUBOUT (LOGCLR (SETQ CH (POP BUFFER)) (LOGOR (SLASH-FLAG) (STRING-BEGIN-FLAG) (STRING-END-FLAG))) OFILE) (REPRINT (REVERSE BUFFER) PARENSCOUNT STARTPOS OFILE))) (COND ((PLUSP (LOGAND CH (SLASH-FLAG))) (AND OFILE (OR (RUBOUT (POP BUFFER) OFILE) (REPRINT (REVERSE BUFFER) PARENSCOUNT STARTPOS OFILE)))) ((NOT (MINUSP STRING-END)) (AND (PLUSP (LOGAND CH (STRING-BEGIN-FLAG))) (SETQ STRING-END -1))) ((PLUSP (LOGAND CH (STRING-END-FLAG))) (SETQ STRING-END (LOGAND CH (ASCII-BITS)))) ((PLUSP (LOGAND (SETQ SYNTAX (STATUS SYNTAX (LOGCLR CH (LOGOR (SLASH-FLAG) (STRING-BEGIN-FLAG) (STRING-END-FLAG))))) (OPEN-SYNTAX))) (PROMPTER BUFFER SIZE OFILE) (SETQ COUNT (- COUNT 1))) ((PLUSP (LOGAND SYNTAX (CLOSE-SYNTAX))) (PROMPTER BUFFER SIZE OFILE) (SETQ COUNT (+ COUNT 1))))) (T (AND OFILE (TERPRI OFILE)))) (GO LOOP)) ((EQ FN 'READLINE) (PUSH CH BUFFER) (GO LOOP)) ((NOT (MINUSP STRING-END)) (COND ((= CH STRING-END) (PUSH (LOGOR CH (STRING-END-FLAG)) BUFFER) (SETQ STRING-END -1)) (T (PUSH CH BUFFER))) (GO LOOP)) ((AND (PLUSP (LOGAND SYNTAX (FORCE-FEED))) (PLUSP (LOGAND SYNTAX (ALTERNATE-SYNTAX)))) (GO DONE)) ((PLUSP (LOGAND SYNTAX (SPACE-SYNTAX))) (COND ((OR (PLUSP COUNT) (NOT USEFUL) LINMODE (NOT TTYREAD)) (PUSH CH BUFFER) (PROMPTER BUFFER SIZE OFILE) (GO LOOP)) (T (GO DONE)))) ((PLUSP (LOGAND SYNTAX (SINGLE-SYNTAX))) (COND ((OR (PLUSP COUNT) LINMODE (NOT TTYREAD)) (SETQ USEFUL T) (PUSH CH BUFFER) (GO LOOP)) (T (GO DONE)))) ((PLUSP (LOGAND SYNTAX (MACRO-SYNTAX))) ((LAMBDA (MAC) (COND ((EQ MAC '+INTERNAL-/;-MACRO) (PUSH (LOGOR CH (STRING-BEGIN-FLAG)) BUFFER) (SETQ STRING-END (^M))) ((EQ MAC '+INTERNAL-/|-MACRO) (PUSH (LOGOR CH (STRING-BEGIN-FLAG)) BUFFER) (SETQ STRING-END (VERTICAL-BAR))) (T (PUSH CH BUFFER)))) (CAR (STATUS MACRO (+ CH 0)))) (SETQ USEFUL T) (GO LOOP)) ((PLUSP (LOGAND SYNTAX (OPEN-SYNTAX))) (SETQ COUNT (+ COUNT 1)) (SETQ USEFUL T) (PUSH CH BUFFER) (PROMPTER BUFFER SIZE OFILE) (GO LOOP)) ((PLUSP (LOGAND SYNTAX (CLOSE-SYNTAX))) (COND ((OR (PLUSP COUNT) (NOT USEFUL) LINMODE (NOT TTYREAD)) (COND ((PLUSP (SETQ COUNT (- COUNT 1))) (PUSH CH BUFFER) (PROMPTER BUFFER SIZE OFILE) (GO LOOP)) (T (GO DONE)))) (T (GO DONE)))) ((PLUSP (LOGAND SYNTAX (WORTHY-SYNTAX))) (PUSH CH BUFFER) (SETQ USEFUL T) (GO LOOP)) (T (PUSH CH BUFFER) (GO LOOP))) DONE (AND OFILE ((LAMBDA (POS) (LINENUM OFILE (CAR POS)) (CHARPOS OFILE (CDR POS))) (CURSORPOS OFILE))) (PUSH CH BUFFER) (SETQ BUFFER (NREVERSE BUFFER)) (MAP '(LAMBDA (X) (AND (PLUSP (LOGAND (CAR X) (LOGOR (SLASH-FLAG) (STRING-BEGIN-FLAG) (STRING-END-FLAG)))) (RPLACA X (LOGCLR (CAR X) (LOGOR (SLASH-FLAG) (STRING-BEGIN-FLAG) (STRING-END-FLAG)))))) BUFFER) (PROMPTER NIL SIZE OFILE) (RETURN BUFFER))) (SSTATUS TTYSCAN 'TTY-PRESCAN) WEDNESDAY JUNE 11,1975 NM+2D.17H.37M.36S. LISP 1076 - GLS - TRY NEWIO! BRIEF SYNOPSIS: FOR ALL LISPS: [1] PRIN1, PRINC, AND PRINT NOW ALWAYS RETURN T [2] NEW FUNCTION: PROGV DOES DYNAMIC VARIABLE BINDING [3] NEW FUNCTION: MAPATOMS MAPS OVER ALL ATOMS IN AN OBARRAY [4] FLATC HAS BEEN SPEEDED UP FOR SYMBOLS FOR NEWIO: [A] EDIT NOW WORKS [B] NEW FUNCTION: LOAD LOADS UP BOTH EXPR AND FASL FILES [C] NEW FUNCTION: INCLUDE IS LIKE A MIDAS .INSRT [D] UREAD'S EOF HANDLER HAS CHANGED [E] NEW FUNCTION: FILEPOS IS FINALLY IMPLEMENTED [F] (STATUS FILEMODE) RETURNS FILEPOS INDICATOR IF APPROPRIATE ---------------------------------------------------------------- [1] PRIN1, PRINC, AND PRINT NOW ALL RETURN T INSTEAD OF THEIR ARGUMENTS. THIS IS A BELATED FAST ARITHMETIC MOD. [2] (PROGV ... ) EVALUATES ... AS A PROGN IN AN ENVIRONMENT CREATED BY BINDING THE SYMBOLS IN TO THE RESPECTIVE VALUES IN . THAT IS, THE FIRST TWO ARGUMENTS TO PROGV ARE EVALUATED; THE FIRST MUST PRODUCE A LIST OF SPECIAL VARIABLES, AND THE SECOND A LIST OF VALUES. THE VARIABLES ARE THEN BOUND TO THE VALUES. IF TOO FEW VALUES ARE SUPPLIED, THE REST OF THE VARIABLES ARE BOUND TO NIL. IF TOO MANY VALUES ARE SUPPLIED, THE EXCESS VALUES ARE IGNORED. THE BODY OF THE PROGV IS THEN EVALUATED AS A PROGN, THE VARIABLES UNBOUND TO THEIR OLD VALUES, AND THE VALUE OF THE LAST FORM IS RETURNED. EXAMPLE: (SETQ A 'FOO) (SETQ B 'BAR) (PROGV (LIST A B 'B) (LIST B) (LIST A B FOO BAR)) ==> (FOO NIL BAR NIL) [3] (MAPATOMS ) MAPS THE FUNCTION OF ONE ARGUMENT OVER ALL SYMBOLS IN THE CURRENT OBARRAY, AND THEN RETURNS NIL. EXAMPLE: (MAPATOMS (FUNCTION (LAMBDA (X) (AND (= (FLATC X) 11.) (PRINT X))))) WOULD PRINT: NOINTERRUPT GC-OVERFLOW AND RETURN NIL. A SECOND ARGUMENT MAY BE SUPPLIED, WHICH MUST BE AN OBARRAY (*NOT* AN ATOM WITH AN OBARRAY AS AN ARRAY PROPERTY!!!). THE FUNCTION IS THEN MAPPED OVER THE SPECIFIED OBARRAY. [4] FLATC HAS SPECIAL SPEED-OF-LIGHT CODE FOR SYMBOLS, IN CASE ANYONE WANTS TO KNOW... ---------------------------------------------------------------- [A] THE EDIT PACKAGE NOW WORKS CORRECTLY IN NEWIO. [B] THE LOAD FUNCTION TAKES A NEWIO FILE NAME AS ITS ARGUMENT, AND ATTEMPTS TO LOAD IT UP. IF NO SECOND FILE NAME IS GIVEN, IT FIRST TRIES USING "FASL", AND THEN ">". AFTER FINDING THE FILE, IT DETERMINES WHETHER IT IS A FASL FILE OR NOT (BY LOOKING AT THE FIRST WORD). IF A FASL FILE, IT CALLS FASLOAD TO LOAD THE FILE. OTHERWISE, IT OPENS THE FILE AS AN ASCII FILE, PUSHES IT ON THE INSTACK, AND PERFORMS A READ-EVAL LOOP UNTIL END OF FILE. BECAUSE OF THIS MODE OF OPERATION, INCLUDE'S (SEE [C]) WILL WORK IN LOADED FILES. THE IDEA IS THAT YOU SAY (LOAD 'FOO) AND IT LOADS FOO. [C] INCLUDE IS A FEXPR WHICH TAKES A FILE NAME. (DEFUN INCLUDE FEXPR (X) (INPUSH (OPEN (CAR X)))) THAT IS, ONE TYPICALLY WOULD WRITE: (INCLUDE |DSK:GLS;FOO >|) OR WHATEVER. IF THIS IS EVALUATED IN THE COURSE OF UREAD'ING OR LOAD'ING A FILE, THE EFFECT IS TO INCLUDE THE TEXT OF THE INSERTED FILE IN PLACE OF THE INCLUDE. (OF COURSE, USER-SUPPLIED EOF HANDLERS MAY ALTER THIS SOMEWHAT.) EVENTUALLY THE @ PROGRAM WILL UNDERSTAND INCLUDE'S. [D] UREAD'S EOF HANDLER WAS FORMERLY DEFINED TO BE: (LAMBDA (FILE EOFVAL) (SETQ UREAD NIL)) IT IS NOW DEFINED TO BE: (LAMBDA (FILE EOFVAL) (SETQ UREAD NIL) EOFVAL) SO THAT READ OF ONE ARGUMENT WILL WORK CORRECTLY ON A UREAD FILE. [E] FILEPOS IS NOW IMPLEMENTED, EXCEPT THAT IT DOES NOT WORK YET TO TRY TO SET THE FILEPOS ON AN OUTPUT FILE. (ONE MAY READ THE CURRENT FILEPOS WHILE WRITING, HOWEVER.) FILEPOS MEASURES POSITION IN TERMS OF CHARACTERS FOR ASCII FILES, AND FIXNUMS (WORDS) FOR FIXNUM FILES. [F] (STATUS FILEMODE FOO) WILL RETURN THE FLAG "FILEPOS" IN THE CDR OF ITS RESULT IFF THE FILE FOO WILL WORK FOR BOTH READING AND SETTING THE FILEPOS. TUESDAY MAY 27,1975 FM+2D.18H.3M.18S. NEWIO 1061 - GLS - Note that ONEWIO^K or OQ^K gets an old version of NEWIO (Q). Brief synopsis: [1] MSGFILES controls output of "messages" from LISP. [2] File arrays as arguments to SYSCALL supply channel number. [3] ERRPRINT may take a second arg (output files). [4] (CLOSE foo) does (SSTATUS TTYCONS foo NIL) if foo is a tty. [5] OPEN tends to reset file array attributes. [6] A sample program to do rubout processing. [7] A sample program to use 12-bit chars on Knight keyboards. [8] A sample program to use the echo area. [9] A sample program to hack the line printer. [10] A sample program to create "dribble files" using ECHOFILES. ---------------------------------------------------------------- [1] The variable MSGFILES is like the variable OUTFILES, except that "messages" like GC messages, error messages, ";BKPT barf", etc. are output to MSGFILES files and not to OUTFILES files. (Recall that OUTFILES is the list of default user output files, controlled by ^R. There is no switch equivalent to ^R for MSGFILES.) Initially the value of MSGFILES is (T), i.e. messages go only to the tty. [2] If a file array is given as an input argument to SYSCALL in newio, the system actually gives the .CALL the channel number of the file array. If T is given, the channel number of the input tty file T is supplied. Thus: (SYSCALL 0 'SCML T 7) sets the number of command lines (size of echo area) to 7 for the standard input tty. By the way, if you ever use SYSCALL for something you think LISP might want to provide as a separate function (for ease of use, compatibility with other systems, etc.) please send mail to GLS describing the usage. [3] The ERRPRINT function now takes an optional second argument like PRINT to specify the output files to print the message on. Thus, for example, (ERRPRINT NIL MSGFILES) prints the most recent error message onto the message files. [4] Closing a tty file will undo any (SSTATUS TTYCONS) pair that that file may be engaged in. Since OPEN uses CLOSE if given an actual file as first argument, note that it may be necessary to re-TTYCONS two tty files after re-opening one or both of them. [5] In general, re-opening a file (especially a tty) resets the file array for that tty. LISP makes an effort to save some important attributes about the input and output T files (standard tty) when starting up and re-opening the T tty files, but this is not a general attribute of the OPEN function. Thus, after re-opening a file array, the attributes of that file array (such as (SSTATUS TTYCONS), (SSTATUS TTY), (SSTATUS TTYINT), (EOFFN) or (ENDPAGEFN), etc.) should be set up all over again. [6] Sometimes a user may want to do his own rubout processing without having to hack the ultimately hairy (SSTATUS TTYSCAN) feature. Here is a function showing the correct way to do rubout processing for simple applications. ;;; This function takes two arguments. ;;; The first is the character (a fixnum) which terminates input. ;;; The second is the file to read from (T for tty input). ;;; It works to use this function on a non-tty. ;;; The result returned is a list of fixnums representing the ;;; characters read and not rubbed out. The termination character ;;; is not included in this list, but thrown away. ;;; Over-rubout does not do anything at all. ;;; Example: (SNARF-CHARS-UNTIL 3 t) ;;; reads characters from T (the tty) until a ^C (ascii code 3) ;;; is typed. If the user types "FOOBERAR^C", ;;; then the result will be (106 117 117 102 101 122). ;;; ;;; Note the use of the newio function RUBOUT to rub characters out. ;;; If RUBOUT returns NIL, then it could not rub the character out ;;; (e.g. it was tab or cr); it is necessary then to re-print the ;;; list of buffered characters. ;;; TTYP is non-NIL iff the input file is a tty. ;;; ECHO-FILE is the associated output file of the input tty, ;;; or NIL if the input file has none or isn't a tty. ;;; START-POS is the original cursor position in ECHO-FILE, or NIL. ;;; BUFFER is a list of characters read in reverse order. (DEFUN SNARF-CHARS-UNTIL (ENDCHAR INPUT-FILE) ((LAMBDA (TTYP) ((LAMBDA (ECHO-FILE) (DO ((START-POS (AND ECHO-FILE (CURSORPOS ECHO-FILE))) (BUFFER) (CHAR (TYI INPUT-FILE) (TYI INPUT-FILE))) ((= CHAR ENDCHAR) (NREVERSE BUFFER)) (COND ((= CHAR 177) (AND BUFFER ECHO-FILE (OR (RUBOUT (CAR BUFFER) ECHO-FILE) (PROGN (CURSORPOS (CAR START-POS) (CDR START-POS) ECHO-FILE) (CURSORPOS 'E ECHO-FILE) (MAPC (FUNCTION (LAMBDA (CH) (TYO CH ECHO-FILE))) (REVERSE (CDR BUFFER)))))) (AND BUFFER (SETQ BUFFER (CDR BUFFER)))) (T (SETQ BUFFER (CONS CHAR BUFFER)))))) (AND TTYP (STATUS TTYCONS INPUT-FILE)))) (MEMQ 'TTY (CAR (STATUS FILEMODE INPUT-FILE))))) [7] This function shows the correct way to re-open the tty in 12-bit mode on a Knight keyboard. Note that the LISP system normally folds 12-bit characters down to 7 bits always, except for the TYI function. Thus the READTABLE still only has 200 entries, etc. ;;; Open the tty in 12-bit mode. After (12-BIT-OPEN) is done, ;;; (TYI) from the tty will return 12-bit characters. The characters ;;; are as supplied by ITS: ;;; bit value ITS name correspondence ;;; 2.3 4000 %TXTOP TOP ;;; 2.2 2000 %TXSFL SHIFT LOCK ;;; 2.1 1000 %TXSFT SHIFT ;;; 1.9 400 %TXMTA META ;;; 1.8 200 %TXCTL CONTROL ;;; 1.7-1.1 177 %TXASC ascii code ;;; After re-opening the input tty in 12-bit mode, it is necessary ;;; to restore the attributes of the file array. ;;; In this mode, the LISP system control characters are set up ;;; to ignore control characters which do not actually have the ;;; CONTROL bit set. Thus typing TOP-X to get "beta" will not ;;; invoke the system ^C interrupt. User interrupt character ;;; functions must decide for themselves whether to do such ;;; filtering (they receive the full 12-bit character as an ;;; argument, and so may do this if desired). (DEFUN 12-BIT-OPEN NIL ((LAMBDA (SCAN-FUNCTION) (OPEN T '(TTY IN SINGLE FIXNUM)) ;OPEN IN 12-BIT MODE (SSTATUS TTYCONS T T) ;TIE TO OUTPUT TTY (SSTATUS TTYSCAN SCAN-FUNCTION) ;SET UP RUBOUT HANDLER (MAPC (FUNCTION (LAMBDA (CH INT) ;SET UP STANDARD (SSTATUS TTYINT ; CONTROL CHARACTERS, CH ; REQUIRING "CONTROL" (+ INT 200)))) ; KEY FOR ANY EFFECT '(3 4 7 22 23 24 26 27 30 32) '(3 4 7 22 30 24 26 27 30 32))) (STATUS TTYSCAN))) ;OLD RUBOUT HANDLER [8] Here is a function which opens up and manipulates tty files such that input is typed in the echo area and output appears above. Rubout processing happens correctly in the echo area. Note that it uses TTY-ENDPAGEFN, the **MORE** processor defined in the previous LISP RECENT. (DEFUN SPLITSCREEN (ECHOAREASIZE) ((LAMBDA (ECHOTTY VERTICAL) (SSTATUS TTYCONS T ECHOTTY) ;cons echo area tty to input tty (PAGEL T (- VERTICAL ECHOAREASIZE)) ;set pagel for main area tty (ENDPAGEFN T 'TTY-ENDPAGEFN) ;set endpagefn (SYSCALL 0 'SCML T ECHOAREASIZE) ;set size of echo area (CURSORPOS 'C T) ;clear screen (why not?) 'DONE) (OPEN '((TTY)) '(TTY OUT ECHO)) ;file array for echo area tty output (CAR (STATUS TTYSIZE T)))) Here is a version which causes ALL input and output to happen in the echo area, leaving the main program area free for graphics or whatever else. (DEFUN SMALLSCREEN (ECHOAREASIZE) (OPEN T '(TTY OUT ECHO)) (SSTATUS TTYCONS T T) (SYSCALL 0 'SCML T ECHOAREASIZE) 'DONE) [9] Here are some routines which simulate the old ^B-^E feature of oldio. Since ^B is a break in newio, ^A and ^E are used. The functions WALBEG and WALEND are as in DDT, and are used to open and close the wallpaper file. If ^A discovers that WALBEG has not been called, the TPL device is used. ;;; WALLPAPER ROUTINES ;;; VALUE OF WALLPAPERFILE, IF NON-NIL, IS FILE ARRAY FOR ;;; WALLPAPER. ;;; ^A-HANDLER IS INVOKED BY TYPING ^A. TURNS ON OUTPUT ;;; TO WALLPAPER FILE. ;;; ^E-HANDLER IS INVOKED BY ^E. TURNS OFF WALLPAPER OUTPUT. ;;; WALBEG INITIALIZES SETUP TO SPECIFIED FILE. ;;; WALEND TERMINATES THE CURRENT WALLPAPER FILE, ;;; AND NAMES IT IF DESIRED (DEFAULT IS "WPAPER >"). (DECLARE (SPECIAL WALLPAPERFILE OLD^R)) (SETQ WALLPAPERFILE NIL) (DEFUN ^A-HANDLER (F CH) (OR WALLPAPERFILE (WALBEG TPL)) (OR ^A (SETQ OLD^R ^R)) (SETQ ^A T) (SETQ ^R T) (OR (MEMQ WALLPAPERFILE OUTFILES) (SETQ OUTFILES (CONS WALLPAPERFILE OUTFILES)))) (DEFUN ^E-HANDLER (F CH) (SETQ ^R OLD^R) (SETQ ^A NIL) (SETQ OUTFILES (DELQ WALLPAPERFILE OUTFILES))) (DEFUN WALBEG FEXPR (DEVDIR) (WALEND) (SETQ WALLPAPERFILE (OPEN (LIST (OR DEVDIR (CAR (DEFAULTF NIL))) '_WALL_ 'PAPER) 'OUT)) T) (DEFUN WALEND FEXPR (NAME) (COND (WALLPAPERFILE (^E-HANDLER NIL NIL) (AND NAME (RENAME WALLPAPERFILE NAME)) (CLOSE WALLPAPERFILE) (SETQ WALLPAPERFILE NIL)))) (SSTATUS TTYINT 1 '^A-HANDLER) (SSTATUS TTYINT 5 '^E-HANDLER) [10] Here are some functions to create "dribble files", i.e. files contains both input and output. ;;; (DRIBBLE) opens a dribble output file. ;;; DRIBBLE, if non-nil, is the dribble output file array. ;;; (WIPE FOO BAR) wipes up the current dribble, closing ;;; the file and naming it FOO BAR. (DECLARE (SPECIAL DRIBBLE)) (DEFUN DRIBBLE NIL (WIPE /.DRIB/. OUTPUT) (SETQ DRIBBLE (OPEN '|.DRIB. OUTPUT| 'OUT))) (SETQ OUTFILES (CONS DRIBBLE OUTFILES)) (SETQ ECHOFILES (CONS DRIBBLE ECHOFILES)) (SETQ MSGFILES (CONS DRIBBLE MSGFILES)) (SETQ ^R T)) (DEFUN WIPE FEXPR (NAME) (COND (DRIBBLE (OR (SETQ OUTFILES (DELQ DRIBBLE OUTFILES)) (SETQ ^R NIL)) (SETQ ECHOFILES (DELQ DRIBBLE ECHOFILES)) (SETQ MSGFILES (DELQ DRIBBLE MSGFILES)) (CLOSE (RENAME (PROG2 NIL DRIBBLE (SETQ DRIBBLE NIL)) NAME))))) FRIDAY APRIL 18,1975 FQ+9H.34M.47S. LISP 1049 - GLS - A NEW VERSION OF NEWIO IS UP! TRY IT, AND REPORT ANY LOSSES TO GLS, OR SAY :BUG NEWIO ... ^C TO DDT. BRIEF SYNOPSIS: [0] INCOMPATIBLE CHANGE!!! PRINT, PRIN1, AND PRINC TO GIVE OUT T [1] COMPILER RESETS GENSYM COUNTER [2] DEFUN MAY REMOVE THE EXPR-HASH PROPERTY [3] VERTICAL BAR AND EXCLAMATION POINT AS SYMBOL QUOTERS [4] NEW PECULIAR FUNCTION: SYSCALL [5] COMPILER ALLOWS DECLARES IN DO LOOPS [6] TECHNIQUE: AVOIDING NUMBER CONSING [7] EVALHOOK [8] NEW VERSION OF NEWIO OUT [A] TYIPEEK NOW IMPLEMENTED [B] ^Q TO ALLOC AND JCL WORK [C] (STATUS FILEMODE) [D] (STATUS TTYINT) [E] (STATUS TTYCONS) [F] (STATUS TTYSCAN) [G] RUBOUT [H] NEW INTERRUPT SYSTEM [I] VALUE OF AUTOLOAD IS THE AUTOLOAD FUNCTION [J] **MORE** INTERRUPTS [K] FASLOAD WITHIN FASLOAD [L] ^X FUNCTION FLUSHED - ^G REMAINS [M] FORCE IS FORCE-OUTPUT AGAIN [N] CLEAR-INPUT AND CLEAR-OUTPUT ---------------------------------------------------------------- [0] A GHOST OF THE PAST LOOMS UP. WHEN NCOMPLR WAS CREATED, WE MADE SOME DECISIONS THAT, FOR EFFICIENCY REASONS, REQUIRED TYO, PRINT, PRIN1, AND PRINC TO RETURN SOME PROVABLY NON-NUMERIC VALUE. GENERALLY, THIS MEANS SOME CONSTANT LIKE T OR NIL. TYO WAS CHANGED LONG AGO, BUT WE HAVE BEEN WAITING UNTIL THE LAST POSSIBLE MINUTE TO MAKE THE REQUISITE CHANGE TO THE PRINT SERIES. THE TIME HAS COME (AND WE HEAR VOICES OF WALRUSES); OUR SYMPATHIES GO OUT TO THOSE, WHO LIKE US, WILL HAVE TO EXPLORE THEIR CODE TO ACCOMODATE THIS INCOMPATIBLE CHANGE. HOWEVER, THIS CHANGE WILL NOT ACTUALLY TAKE EFFECT UNTIL AFTER MAY 19, 1975. IF THE ONLY USE YOUR EVER MADE OF THE VALUE OR PRINT WAS TO CONTINUE AN "AND", YOU NEED NOT WORRY. E.G. (AND (PRED X) (PRINC 'HERE/ WE/ ARE/ ) (PRINT X) (PRINT Y)) WILL STILL WORK ESSENTIALLY THE SAME. BE WARNED ALSO! THE OLD COMPLR IS ESSENTIALLY DEAD; THERE WILL BE A FUNERAL FOR IT SOON. NCOMPLR IS NOW QUITE A BIT MORE BUG-FREE THAN THE OLD COMPLR, AND AFTER COMPLR'S DEMISE, SYS:TS COMPLR WILL LINK TO SYS:TS NCOMPLR. [1] NOTE THAT THE COMPILER USES THE GENSYM FUNCTION FOR GENERATING LAP TAGS, AND RESETS THE GENSYM COUNTER AT THE BEGINNING OF EACH FUNCTION. THEREFORE GENSYM IS NOT A RELIABLE WAY TO GENERATE UNIQUE ATOMS FOR USE BY MACROS IF YOU PLAN TO INTERN THEM (UNINTERNED, THE NAME DOESN'T MATTER, OF COURSE). SORRY ABOUT THAT. [2] DEFUN WILL REMOVE THE EXPR-HASH PROPERTY FROM AN ATOM IF IN EXPR-HASH MODE (DEFUN = T) AND IT INSTALLS A NEW PROPERTY. THIS IS TO PREVENT LOSSES SUCH AS RE-INSTALLING THE OLD DEFINITION NOT WORKING. [3] VERTICAL BAR (ASCII CODE 174) NOW INITIALLY HAS A READ-MACRO PROPERTY WHICH CAUSES IT TO GOBBLE UP CHARACTERS UNTIL THE NEXT VERTICAL BAR, AND MAKE AN INTERNED ATOMIC SYMBOL OUT OF IT. IT IS THUS ANOTHER WAY TO QUOTE CHARACTERS IN ATOMIC SYMBOLS. TO GET A VERTICAL BAR OR CARRIAGE RETURN OR SLASH INTO SUCH A CONSTRUCT, USE SLASH. EXAMPLE: |A /| WILL GOBBLE CHARS UNTIL THE NEXT /| NOT PRECEDED BY //| IS THE ATOMIC SYMBOL WITH THE PRINT NAME: "A | WILL GOBBLE CHARS UNTIL THE NEXT | NOT PRECEDED BY /" THE CARRIAGE RETURN ISN(T PART OF THE PRINT NAME BECAUSE IT HAD NO / IN FRONT OF IT. THIS IS SO AN AUTOMATIC TERPRI FORCED BY THE LINEL WON'T SCREW THINGS UP. AS A CONCESSION TO DATAPOINT LOSERS, EXCLAMATION POINT PRESENTLY HAS A SIMLAR PROPERTY. HOWEVER, LOSERS ARE ADVISED NOT TO PUT ! IN THEIR FILES, AS VERTICAL BAR IS THE "OFFICIAL" ONE. USERS OF CONNIVER ON DATAPOINTS HAVE A PROBLEM -- TOUGH NOOGIES. EVENTUALLY PRIN1 WILL HAVE SOME SMARTS ABOUT OUTPUTTING VERTICAL BARS. IN NEWIO, THE RUBOUT PROCESSOR IS CLEVER ABOUT VERTICAL BARS, BUT NOT IN OLDIO -- BEWARE. [4] THE FUNCTION SYSCALL TAKES FROM TWO TO TEN ARGUMENTS. THEY ARE: (1) N, THE NUMBER OF OUTPUT RESULTS DESIRED (A FIXNUM FROM 0 TO 8); THE RETURN VALUE OF SYSCALL WILL THUS BE A LIST OF N FIXNUMS. OPTIONALLY, THE "CONTROL" BITS "C" MAY BE SPECIFIED BY GIVING AS FIRST ARG N + LSH[C;18.] (2) NAME OF SYSTEM CALL (ATOMIC SYMBOL). (3-10) INPUT ARGUMENTS (FIXNUMS). THE SPECIFIED ITS SYSTEM CALL IS PERFORMED AND A LIST OF THE RESULTS ARE RETURNED AS FIXNUMS. IF AN ERROR OCCURS, A FIXNUM (THE ERROR CODE) IS RETURNED INSTEAD OF THE LIST OF RESULTS. NO COMPENSATION IS MADE FOR SYSTEM CALLS THAT TAKE CHANNEL NUMEBSR, AOBJN POINTERS, CLOBBER THEIR INPUT ARGS, ETC. BEWARE! EXAMPLE: (SYSCALL 6 'CNSGET 2) WILL RETURN A LIST OF SIX FIXNUMS DESCRIBING THE TTY (OLDIO OPENS THE TTY ON CHANNEL 2 -- NEWIO USERS, BEWARE!!!). [5] THE COMPILER NOW ALLOWS LOCAL DECLARATIONS TO BE PUT IN DO LOOPS IN THE SAME WAY THEY MAY BE IN LAMBDAS AND PROGS. EXAMPLE, TO FIND THE INDEX OF THE FIRST "FOO" IN THE LIST X: (DO ((N 0 (1+ N)) (L X (CDR L))) ((NULL L) -1) (DECLARE (FIXNUM N)) (AND (EQ (CAR L) 'FOO) (RETURN N))) [6] PROGRAMMING TECHNIQUE: YOU MAY FIND YOUR FUNCTIONS DOING AN INORDINATE AMOUNT OF NUMBER CONSING EVEN AFTER USING NCOMPLR. IF SO, CONSIDER WHETHER ANY OF YOUR FUNCTIONS, WHICH ARE NOT DECLARED TO BE FIXNUM OR FLONUM FUNCTIONS ARE NEEDLESSLY RETURNING NUMERICAL RESULTS. E.G., (DEFUN BAR (X Y N M) (COND ((MUMBLE X Y) (PRINC '/ANSWERS/ ARE:) (PRIN1 N) (PRINC '/ ) (PRIN1 M) (TERPRI))) N) ;RANDOM RETURN VALUE IF BAR IS INDEED USED PRIMARILY FOR EFFECT, THERE IS NO REASON TO RETURN A NUMERICAL VALUE, WHICH WILL USUALLY CAUSE NCOMPLR TO OUTPUT A NUMBER-CONS CALL. SOMETIMES, RETURNING A NUMERICAL RESULT MAY BE PARTIALLY HIDDEN FROM YOUR EYE, AS IN THE CASE OF FEEDING AN ARG TO A FUNCTION SUCH AS STORE, WHICH RETURNS ONE OF ITS INPUT ARGS AS RESULTANT VALUE E.G., (DEFUN FOO (J N) (STORE (MY-FIXNUM-ARRAY N) J)) THIS WILL STORE THE FIXNUM J INTO SLOT N, AND IT WILL ALSO RETURN J. UNLESS YOU REALLY NEED FOO TO RETURN J, YOU SHOULD WRITE (DEFUN FOO (J N) (STORE (MY-FIXNUM-ARRAY N) J) NIL) AND LET NIL BE RETURNED. THIS APPLIES TO ANY FUNCTION WHOSE LAST ACTION WILL PRODUCE A NUMERICAL VALUE, AND WHOSE PURPOSE IS PRIMARILY TO PERFORM SOME SIDE-EFFECT. [7] AT LONG LAST, HERE IS SOME (MINIMAL) DOCUMENTATION ON THE INFAMOUS EVALHOOK FEATURE! THE EVALHOOK FEATURE WAS INVENTED SO THAT A DYNAMIC SINGLE-STEP TRACER COULD BE WRITTEN. USING THE EVALHOOK FEATURE IS A BLACK ART, SO READ ON, BUT CAREFULLY. THERE EXIST BOTH A FUNCTION AND A VARIABLE CALLED "EVALHOOK". THERE IS ALSO A (SSTATUS EVALHOOK). ((STATUS EVALHOOK) EXISTS BUT DOES NOT RETURN ANYTHING MEANINGFUL AT ALL.) THE SEMANTICS OF THE VARIABLE EVALHOOK ARE AS FOLLOWS: WHENEVER THE FUNCTION EVAL IS ENTERED, WHETHER FROM WITHIN THE SYSTEM OR BY EXPLICIT INVOCATION BY THE USER, THEN IF THE VALUE OF THE VARIABLE EVALHOOK IS NON-NIL, AND *RSET IS NON-NIL, AND (SSTATUS EVALHOOK T) HAS BEEN DONE, THEN EVAL DOES NOT EVALUATE ITS ARGUMENT. INSTEAD IT ASSUMES THAT THE VALUE OF THE VARIABLE EVALHOOK IS A FUNCTION OF ONE ARGUMENT. IT FETCHES THIS FUNCTION, LAMBDA-BINDS EVALHOOK TO NIL, AND CALLS THE FUNCTION WITH THE ARGUMENT TO EVAL. THIS FUNCTION THEN HAS THE RESPONSIBILITY FOR EVALUATING THE FORM AND RETURNING A RESULT. THIS RESULT BECOMES THE RESULT OF THE ORIGINAL CALL TO EVAL. IT IS EVIDENT THAT SUCH A FUNCTION CAN DO OTHER THINGS BESIDES EVALUATE THE FORM; E.G. IT CAN PRINT TRACE INFORMATION. THE REASON THAT EVALHOOK IS BOUND BACK TO NIL BEFORE CALLING THE HOOK FUNCTION IS BECAUSE THE HOOK FUNCTION MAY BE INTERPRETED, AND WE WANT TO AVOID INFINITE RECURSION. THERE IS A PROBLEM, THOUGH: HOW CAN THE HOOK FUNCTION EVALUATE ITS ARGUMENT ONCE IT HAS PRINTED STUFF OUT? IF IT JUST CALLS EVAL BACK AGAIN, THEN THE VARIABLE EVALHOOK WILL BE NIL, AND THE HOOK FUNCTION WILL NOT GET CALLED FOR THE RECURSIVE CALLS ON EVAL. IF IT SETQ'S EVALHOOK TO THE HOOK FUNCTION AND THEN CALLS EVAL, THE HOOK FUNCTION WILL GET CALLED BACK WITH THE SAME THING. FOR THIS REASON THERE IS AN EVALHOOK FUNCTION. THE EVALHOOK FUNCTION CALLS EVAL WITH ITS FIRST ARGUMENT, AFTER BINDING THE VARIABLE EVALHOOK TO ITS LAST ARGUMENT, AND BYPASSING THE HOOK FUNCTION CHECK IN EVAL. IF THAT ALL WENT BY TOO FAST, TAKE A LOOK AT THESE DEFINITIONS IN LISP: (DECLARE (SPECIAL *RSET EVALHOOK)) (DEFUN EVAL N (OR (= N 1) (= N 2) (ERROR '|WRONG NUMBER OF ARGS TO LSUBR| (CONS 'EVAL (LISTIFY N)) 'WRNG-NO-ARGS)) (AND (= N 2) (HACK-FAKE-ALIST (ARG 2))) (COND ((AND EVALHOOK *RSET (SSTATUS-EVALHOOK-T-WAS-DONE-P)) ((LAMBDA (EVALHOOK) (FUNCALL EVALHOOK (ARG 1))) NIL)) (T (+INTERNAL-EVAL (ARG 1))))) (DEFUN EVALHOOK N (OR (= N 2) (= N 3) (ERROR '|WRONG NUMBER OF ARGS TO LSUBR| (CONS 'EVALHOOK (LISTIFY N)) 'WRNG-NO-ARGS)) (AND (= N 3) ;SECOND ARG OF 3 IS ALIST (HACK-FAKE-ALIST (ARG 2))) ((LAMBDA (EVALHOOK) (+INTERNAL-EVAL (ARG 1))) (ARG N))) THE REASON THAT BOTH (*RSET T) AND (SSTATUS EVALHOOK T) MUST BE DONE IS FOR REASONS OF EFFICIENCY (SIGH). HERE IS AN EXAMPLE OF THE USAGE OF EVALHOOK: (DEFUN HOOK FEXPR (X) ;CALLED AS (HOOK

) ((LAMBDA (*RSET EVALHOOK) (PROG2 (SSTATUS EVALHOOK T) ;MAGIC SSTATUS (EVAL (CAR X)) ;EVALUATE FORM (SSTATUS EVALHOOK NIL))) ;MORE MAGIC T 'HOOK-FUNCTION)) ;THE HOOK FUNCTION (DEFUN HOOK-FUNCTION (F) (TERPRI) ;PRINT PRETTY MESSAGE FOR INPUT (PRINC '|FORM: |) (PRIN1 F) ((LAMBDA (V) ;V GETS VALUE OF FORM (TERPRI) ;PRETTY OUTPUT MESSAGE (PRINC '|VALUE: |) (PRIN1 V)) (EVALHOOK F 'HOOK-FUNCTION))) ;THIS IS HOW TO EVAL THE FORM ; SO AS TO HOOK SUB-FORMS THUS FOR SOMETHING LIKE (HOOK (CONS (CAR '(A . B)) 'C)) THE FOLLOWING OUTPUT MIGHT BE SEEN: FORM: (CONS (CAR (QUOTE (A . B))) (QUOTE C)) FORM: (CAR (QUOTE (A . B))) FORM: (QUOTE (A . B)) VALUE: (A . B) FORM: (QUOTE C) VALUE: C VALUE: ((A . B) . C) ((A . B) . C) NATURALLY, ONE CAN DREAM UP INFINITELY HAIRY THINGS TO DO WITH THIS, SUCH AS INTERACTIVE TRACING AND BREAKING, INDENTED OUTPUT, ETC. [8] A NEW VERSION OF NEWIO IS OUT! HERE FOLLOWS A COPY OF .INFO.;NEWIO STUFF, WHICH HAS BEEN UPDATED TO ACCOUNT FOR ALL THE CHANGES MENTIONED IN THE SYNOPSIS. NEWIO NEWIO NEWIO NEWIO NEWIO NEWIO NEWIO NEWIO NEWIO NEWIO ---------------------------------------------------------------- THINGS OF NOTE NOT YET IMPLEMENTED: ---------------------------------------------------------------- [1] FILEPOS NOT YET IMPLEMENTED. [2] ALLFILES NOT YET IMPLEMENTED. [3] MOBY I/O DOES NOT YET WORK UNDER NEW I/O. ---------------------------------------------------------------- NEW FUNCTIONS: ---------------------------------------------------------------- (^G) SIGNALS A ^G QUIT; IT REPLACES (IOC G). (IN ) READS IN A FIXNUM FROM A BINARY INPUT FILE AND RETURNS IT. TO GET A BINARY FILE, SEE THE NEW OPEN FUNCTION. (OUT ) OUTPUTS THE FIXNUM TO THE BINARY FILE AND RETURNS T. (TRUENAME ) GIVES THE "TRUE NAME" OF THE FILE, AS OPPOSED TO THE FILE NAMES USED TO OPEN IT. THIS IS THE NAME FOUND AFTER TRANSLATIONS AND LINKS, ETC. (IT IS THE NAME RETURNED BY A .RCHST ON THE FILE'S CHANNEL.) ECHOFILES IS A VARIABLE WHICH, IF NON-NIL, SHOULD BE A LIST OF OUTPUT FILES. THESE OUTPUT FILES RECEIVE EVERY CHARACTER SEEN AS INPUT BY TYI (AND FUNCTIONS WHICH USE TYI, SUCH AS READ). IF A FILE IS A MEMBER OF BOTH THE ECHOFILES AND OUTFILES LISTS, IT WILL BE A "DRIBBLE FILE", RECORDING BOTH INPUT AND OUTPUT. NOTE THAT THE FUNCTION WHICH PRE-SCANS TTY INPUT AND PERFORMS RUBOUT PROCESSING LAMBDA-BINDS ECHOFILES TO NIL, SO YOU WON'T SEE RUBBED-OUT CHARACTERS. (OPEN ) OPENS A FILE AND RETURNS A CORRESPONDING FILE OBJECT. IT IS ACTUALLY AN LSUBR OF ZERO TO TWO ARGUMENTS. THE DEFAULTS TO THE CURRENT DEFAULT FILE NAMES. THE DEFAULTS TO NIL. IF IS A NAMELIST OR NAMESTRING, A NEW FILE ARRAY IS CREATED. IF IS A FILE ARRAY ALREADY, IT IS CLOSED AND RE-OPENED IN THE SPECIFIED MODE; ITS FORMER MODES SERVE AS THE DEFAULTS FOR THE . THE DETERMINES A LARGE NUMBER OF ATTRIBUTES FOR OPENING THE FILE. FOR EACH ATTRIBUTE THERE ARE TWO OR MORE MUTUALLY EXCLUSIVE VALUES WHICH MAY BE SPECIFIED AS FOLLOWS. VALUES MARKED BY A * ARE THOSE USED AS DEFAULTS WHEN THE IS A NAMELIST OR NAMESTRING. IF THE IS AN ATOM, IT IS THE SAME AS SPECIFYING THE LIST OF THAT ONE ATOM. DIRECTION: * IN INPUT FILE * READ SAME AS "IN" OUT OUTPUT FILE PRINT SAME AS "OUT" APPEND OUTPUT, APPENDED TO EXISTING FILE DATA MODE: * ASCII FILE IS A STREAM OF ASCII CHARACTERS. SYSTEM-DEPENDENT TRANSFORMATIONS MAY OCCUR, SUCH AS SUPPLYING LF AFTER CR, OR BEING CAREFUL WITH OUTPUT OF ^P, OR MULTICS ESCAPE CONVENTIONS. FIXNUM FILE IS A STREAM OF FIXNUMS. THIS IS FOR DEALING WITH FILES THOUGHT OF AS "BINARY" RATHER THAN "CHARACTER". IMAGE FILE IS A STREAM OF ASCII CHARACTERS. ABSOLUTELY NO TRANSFORMATIONS ARE MADE. DEVICE TYPE: * DSK STANDARD KIND OF FILE. TTY CONSOLE. IN PARTICULAR, ONLY TTY INPUT FILES HAVE INTERRUPT CHARACTER FUNCTIONS ASSOCIATED WITH THEM. BUFFERING MODE: * BLOCK DATA IS BUFFERED. SINGLE DATA IS UNBUFFERED. IF THE DEVICE TYPE IS TTY, THE DEFAULT IS SINGLE INSTEAD OF BLOCK ON ITS. ECHO MODE: ECHO OPENS OUTPUT TTY IN ECHO AREA (ITS ONLY). SOME OF THESE VALUES ARE OF COURSE SYSTEM-DEPENDENT. YOUR LOCAL LISP SYSTEM WILL ATTEMPT TO DO THE RIGHT THING, HOWEVER, IN ANY CASE. IF THE OPTIONS LIST IS INVALID IN ANY WAY, OPEN MAY EITHER GIVE A WRNG-TYPE-ARGS ERROR, OR BLITHELY ASSUME A CORRECTED VALUE FOR AN ATTRIBUTE. IN GENERAL, ERRORS SHOULD OCCUR ONLY FOR TRULY CONFLICTING SPECIFICATIONS. ON THE OTHER HAND, SPECIFYING BLOCK MODE FOR A DEVICE THAT THE SYSTEM WANTS TO HANDLE ONLY IN CHARACTER MODE MAY JUST GO AHEAD AND USE CHARACTER MODE. (OPENI X) == (OPEN X 'READ) (OPENO X) == (OPEN X 'PRINT) (OPENA X) == (OPEN X 'APPEND) (RUBOUT ) ATTEMPTS TO RUB OUT ONE CHARACTER. SHOULD BE A FIXNUM BETWEEN 0 AND 177 (AN ASCII VALUE). SHOULD BE A TTY OUTPUT FILE; IF OMITTED, T IS ASSUMED. IF IT IS NOT POSSIBLE TO RUB OUT THE CHARACTER CORRECTLY, RUBOUT WILL RETURN NIL INSTEAD OF T; IT IS UP TO THE CALLER TO DO SOMETHING ABOUT THIS CASE. CHARACTERS WHICH CANNOT CORRECTLY BE RUBBED OUT INCLUDE TAB AND CARRIAGE RETURN. IF THE OUTPUT TTY CAN DO CURSOR POSITIONING AND SELECTIVE RASURE, THEN THE CHARACTER IS RUBBED OUT BY ERASING IT FROM THE SCREEN AND BACKING UP THE CURSOR; OTHERWISE, THE CHARACTER IS PRINTED ON THE TTY (RUBOUT ECHO). (SSTATUS TTYSCAN ) SETS UP A TTY PRE-SCAN FUNCTION FOR , WHICH MUST BE A TTY INPUT FILE. IF IS OMITTED, T IS ASSUMED. THE SHOULD ACCEPT THREE ARGUMENTS: (1) THE FILE TO DO PRE-SCANNING FOR. (2) THE INPUT FUNCTION TO PRE-SCAN FOR. POSSIBILITIES ARE READ, TYI, READLINE, EDIT, AND PERHAPS OTHERS. (3) THE NUMBER OF HANGING LEFT PARENTHESES, AS A FIXNUM (MEANINGFUL ONLY IF ARGUMENT 2 IS 'READ). IT IS THE RESPONSIBILITY OF THE PRE-SCAN FUNCTION TO READ IN SOME CHARACTERS FROM THE FILE HANDED TO IT AS ITS FIRST ARGUMENT, AND TO RETURN A LIST OF FIXNUMS BETWEEN 0 AND 177 OCTAL. TYPICALLY THE PRE-SCAN FUNCTION WILL PROVIDE FOR RUBOUT PROCESSING, ETC. IF THE PRE-SCAN FUNCTION RETURNS NIL, AN END-OF-FILE WILL BE SIGNALED FOR THE TTY INPUT FILE. THIS IS A WAY TO SIGNAL OVER-RUBOUT. (THE INITIAL LISP SYSTEM PROVIDES FOR THE INITIAL TTY INPUT FILE A PRE-SCAN FUNCTION WHICH DOES STANDARD RUBOUT PROCESSING.) (STATUS TTYSCAN ) NATURALLY RETURNS THE PRE-SCAN FUNCTION FOR (T IF IS OMITTED). ---------------------------------------------------------------- THINGS WHICH HAVE CHANGED FROM OLD I/O AND NOT IN THE MANUAL: ---------------------------------------------------------------- IN NEW I/O FILES ARE SPECIFIED BY MEANS OF NAMESTRINGS AND NAMELISTS AS DOCUMENTED IN THE MANUAL. THERE IS FURTHERMORE A COMPATIBILITY FEATURE WHICH ALLOWS OLD I/O 4-LISTS TO BE USED INTERCHANGEABLY WITH NEW I/O NAMELISTS. IF THE CAR OF A PUTATIVE NAMELIST IS ATOMIC, THEN IT IS ASSUMED TO BE AN OLD I/O 4-LIST. FINALLY, NEW I/O ON THE PDP-10 KNOWS MOST STANDARD DEVICE NAMES; IF IT SEES A NAME WHERE A DEVICE BELONGS, AND IT IS NOT ONE OF THE STANDARD DEVICE NAMES, AND NO SNAME WAS SUPPLIED, THEN THE NAME IS TAKEN TO BE THE SNAME, AND * IS SUPPLIED FOR THE DEVICE. ALL THESE COMPATIBILITY FEATURES ARE FOR THE PDP-10 ONLY! EXAMPLES: THESE ARE ALL EQUIVALENT AS FILE NAMES: (FOO BAR * GLS) (FOO BAR GLS) ((GLS) FOO BAR) ((* GLS) FOO BAR) THE ARGUMENT TO AN OLD I/O FUNCTION IS ONE OF THESE LISTS; THUS ONE MAY SAY EQUIVALENTLY: (UREAD FOO > * GLS) (UREAD FOO > DSK GLS) ;IF YOUR DEFAULT DEV IS DSK: (UREAD FOO) ;IF YOUR DEFAULT IS DSK:GLS; ; BECAUSE UREAD SUPPLIES > (UREAD (GLS) FOO) ;IF YOUR DEFAULT DEV IS DSK: (UREAD (DSK GLS) FOO) (UREAD (DSK GLS) FOO >) HERE ARE DEFINITIONS OF THE OLD I/O FUNCTIONS IN TERMS OF THE NEW ONES. THEY MAY BE TAKEN QUITE LITERALLY. (DEFUN UREAD FEXPR (FILENAME) (UCLOSE) ((LAMBDA (FILE) (EOFFN FILE (FUNCTION (LAMBDA (EOFFILE EOFVAL) (SETQ UREAD NIL)))) (INPUSH (SETQ UREAD FILE)) (CAR (DEFAULTF FILE))) (OPEN (*UGREAT FILENAME) 'IN))) (DEFUN UCLOSE FEXPR (X) (COND (UREAD (AND (EQ UREAD INFILE) (INPUSH -1)) (CLOSE (PROG2 NIL UREAD (SETQ UREAD NIL)))) (T NIL))) (DEFUN UWRITE FEXPR (DEVDIR) (OR DEVDIR (SETQ DEVDIR (CAR (DEFAULTF NIL)))) (*UWRITE (CONS DEVDIR (COND ((STATUS FEATURE DEC10) (CONS (STATUS JNAME) '(OUT))) ((STATUS FEATURE ITS) '(.LISP. OUTPUT)))) 'OUT (LIST DEVDIR))) (DEFUN UAPPEND FEXPR (FILENAME) (PROG2 (SETQ FILENAME (*UGREAT FILENAME)) (*UWRITE FILENAME 'APPEND FILENAME) (RENAME UWRITE (COND ((STATUS FEATURE DEC10) (CONS (STATUS JNAME) '(OUT))) ((STATUS FEATURE ITS) '(/.LISP/. APPEND)))))) (DEFUN *UWRITE (NAME MODE NEWDEFAULT) ;INTERNAL ROUTINE (COND (UWRITE (SETQ OUTFILES (DELQ UWRITE OUTFILES)) (CLOSE UWRITE) (SETQ UWRITE NIL))) ((LAMBDA (FILE) (SETQ OUTFILES (CONS (SETQ UWRITE FILE) OUTFILES)) (CAR (DEFAULTF NEWDEFAULT))) (OPEN NAME MODE))) (DEFUN UFILE FEXPR (SHORTNAME) (COND ((NULL UWRITE) (ERROR 'NO/ UWRITE/ FILE (CONS 'UFILE SHORTNAME) 'IO-LOSSAGE)) (T (PROG2 NIL (CAR (DEFAULTF (RENAME UWRITE (*UGREAT SHORTNAME)))) (SETQ OUTFILES (DELQ UWRITE OUTFILES)) (CLOSE UWRITE) (SETQ UWRITE NIL))))) (DEFUN CRUNIT FEXPR (DEVDIR) (CAR (DEFAULTF (AND DEVDIR (LIST DEVDIR))))) (DEFUN *UGREAT (NAME) ;INTERNAL ROUTINE (MERGEF (MERGEF NAME (COND ((STATUS FEATURE DEC10) '(* . LSP)) ((STATUS FEATURE ITS) '(* . >)))) NIL)) (DEFUN UPROBE FEXPR (FILENAME) (SETQ FILENAME (MERGEF (*UGREAT FILENAME) NIL)) (AND (PROBEF FILENAME) FILENAME)) (DEFUN UKILL FEXPR (FILENAME) (DEFAULTF (DELETEF FILENAME)))) CURSORPOS MAY TAKE AN EXTRA ARGUMENT TO DETERMINE WHICH OUTPUT TTY TO DO THE CURSOR POSITIONING ON. IF THE LAST ARGUMENT CAN BE TAKEN TO BE A TTY, IT IS. ONE INCOMPATIBILITY IS THAT (CURSORPOS 'T) NOW MEANS GET THE COORDINATES OF TTY "T" RATHER THAN GO TO THE TOP OF THE SCREEN. TO GO TO THE TOP OF THE SCREEN FOR THE DEFAULT TTY, USE (CURSORPOS 'TOP) OR (CURSORPOS 124) OR (CURSORPOS 'T T). LISTEN SIMILARLY TAKES AN OPTIONAL ARGUMENT TELLING WHICH INPUT TTY TO LISTEN TO. NOTE THAT (LISTEN T) IS NOT QUITE THE SAME AS (LISTEN); THE LATTER MERELY RETURNS THE RESULT OF A .LISTEN, WHILE THE FORMER ACCOUNTS FOR BUFFERED-UP CHARACTERS WITHIN LISP. TYIPEEK NOW TAKES UP TO THREE ARGUMENTS. THE FIRST ARGUMENT IS AS IN OLD I/O; IT SPECIFIES THE KIND OF PEEKING. A FIRST ARGUMENT OF NIL IS THE SAME AS NO ARGUMENT AT ALL, EXCEPT THAT YOU NEED IT TO GET IN THE OTHER TWO ARGUMENTS. THESE EXTRA ARGUMENTS ARE AS FOR READ, NAMELY A FILE AND/OR EOF VALUE (WHICH SHOULD BE A FIXNUM). AN INCOMPATIBLE CHANGE IS THAT TYIPEEK BY DEFAULT RETURNS -1 INSTEAD OF 3 AT END OF FILE AND NEWIO. (STATUS FILEMODE ) RETURNS A DOTTED PAIR WHOSE CAR IS A LIST OF VALID OPTIONS TO THE OPEN FUNCTION, DESCRIBING THE ATTRIBUTES OF THE FILE, AND WHOSE CDR IS A LIST OF SEMI-SYSTEM-DEPENDENT SYMBOLS DESCRIBING ATTRIBUTES WHICH CANNOT BE FED TO OPEN. AMONG THESE ATTRIBUTES ARE: RUBOUT THIS TTY CAN SELECTIVELY ERASE. SAIL THIS TTY HAS THE SAIL CHARACTER SET. CURSORPOS THIS TTY CAN DO CURSOR POSITIONING. (SSTATUS TTYCONS ) EFFECTIVELY BINDS TWO TTY FILES INTO A SINGLE CONSOLE. ONE OF THE TTY'S SHOULD BE AN INPUT TTY, AND THE OTHER AN OUTPUT TTY. INITIALLY THE SYSTEM PERFORMS (SSTATUS TTYCONS T T) FOR YOU. (STATUS TTYCONS ) RETURNS THE TTY WHICH THE ONE YOU SPECIFIED IS LINKED TO, OR NIL IF IT ISN'T LINKED. THIS IS USEFUL, FOR EXAMPLE, IN A **MORE** INTERRUPT, TO DETERMINE WHICH INPUT TTY TO READ THE CHARACTER FROM. (STATUS TTYINT ) (SSTATUS TTYINT ) THESE STATUS FUNCTION ARE USED TO SET UP AND EXAMINE INTERRUPT CHARACTER FUNCTIONS FOR TTY INPUT FILES. IF IS OMITTED, T (THE STANDARD TTY) IS ASSUMED. SHOULD BE EITHER A NUMERIC ASCII VALUE, OR A SINGLE CHARACTER OBJECT. NOTE THAT IS ALWAYS EVALUATED, UNLIKE (STATUS CHTRAN), FOR EXAMPLE. SHOULD BE EITHER A FUNCTION OF TWO ARGUMENTS OR A FIXNUM. IF IT IS A FUNCTION, THEN WHEN THE INTERRUPT OCCURS IT RECEIVES AS ARGUMENTS THE FILE ON WHICH THE INTERRUPT OCCURRED, AND THE CHARACTER TYPED, AS A FIXNUM. IF THE FUNCTION IS A FIXNUM, IT REPRESENTS THE INTERNAL SYSTEMIC INTERRUPT INITIALLY ASSOCIATED WITH THAT CHARACTER. THUS, FOR EXAMPLE: (SSTATUS TTYINT 7 '(LAMBDA (F CH) (PRINC '|WHY DID YOU TYPE ^G? |))) (SSTATUS TTYINT 6 7) WILL CAUSE ^F T DO A "^G QUIT", AND ^G MERELY TO PRINT THE MESSAGE "WHY DID YOU TYPE ^G? ". NOTE THAT AN INTERRUPT CAN BE ASSOCIATED WITH ANY ASCII CHARACTER, NOT JUST CONTROL CHARACTERS. (FOR A FRUSTRATING EXPERIENCE, SET ")" TO BE A "^G QUIT".) ON ITS, HOWEVER, ONE MUST USE (SSTATUS TTY) TO TELL ITS THAT THINGS LIKE "?" OR "#" ARE TO BE CONSIDERED INTERRUPT CHARACTERS (THIS IS SIMILAR TO THE ACTIVATION CHARACTER PROBLEM). THE MEANINGFUL SYSTEMIC INTERRUPT VALUES ARE: OCTAL VALUE CHAR WHAT IT DOES 3 ^C (SETQ ^D NIL) 4 ^D (SETQ ^D T) 7 ^G ^G QUIT 22 ^R (SETQ ^R T) 24 ^T (SETQ ^R NIL) 26 ^V (SETQ ^W NIL) 27 ^W (SETQ ^W T) 30 ^X ^X QUIT 32 ^Z RETURN TO DDT THE DIFFERENCE BETWEEN (SSTATUS TTYINT 1 4) AND (SSTATUS TTYINT 1 '(LAMBDA (F CH) (SETQ ^D T))) IS THAT THE FORMER WILL LET THE INTERRUPT HAPPEN AND TAKE EFFECT EVEN IF IN A PLACE WHERE A GENERAL USER FUNCTION MAY NOT BE RUN, E.G. IN THE MIDDLE OF A GARBAGE COLLECTION. NOTE THAT INITIALLY ^S IS SET TO BE LIKE ^W AS AN INTERRUPT CHARACTER (SEE BELOW). ^Q IS NO LONGER INITIALLY AN INTERRUPT CHARACTER, BUT A SPLICING MACRO AND FORCE-FEED WHOSE DEFINITION IS (LAMBDA NIL (SETQ ^Q T) NIL). THIS HAS THE SAME EFFECT WHEN TYPED AT THE KEYBOARD AS BEFORE, BUT PREVENTS CERTAIN TIMING SCREWS. ^S NO LONGER DOES (SETQ ^Q NIL). INSTEAD, IT IS THE SAME AS ^W AS AN INTERRUPT CHARACTER. UNLIKE ^W, IT IS ALSO A SPLICING MACRO AND FORCE-FEED, WITH THE DEFINITION (LAMBDA NIL (SETQ ^W NIL) (TERPRI) NIL). THUS IF A LONG PRINTOUT IS COMING AT YOU, JUST TYPE ^S AND YOU WILL SEE A TERPRI WHEN CONTROL RETURNS TO THE KEYBOARD. THIS IS LIKE ^S IN DDT, AND REPLACES THE OLD TRICK OF TYPING ^W AND THEN (IOC V). ^Z NO LONGER DOES A :VK TO DDT. ^U NO LONGER RELEASES THE PAGEPAUSE (WHICH IS ALSO GONE). ^B AND ^E DO NOT TOGGLE LPT OUTPUT. LOSERS CAN PROGRAM THIS FOR THEMSELVES. SEE ML:GLS;NIFTY QIO. ^H IS ALPHABETIC IN NEW I/O, FOR COMPATIBILITY WITH MULTICS, AND SO YOU CAN UNDERLINE NAMES. BEWARE! A_ IS NOT THE SAME ATOM AS _A. (THERE WILL EVENTUALLY BE A USER-PROGRAMMABLE SOLUTION TO THIS "BUG" - A LINE CANONICALIZER.) ^B IN NEW I/O GIVES A "^B BREAK", WHICH IS THE SAME AS THE "^H BREAK" OF OLD I/O. FOR TTY OUTPUT FILES ON ITS, THE ENDPAGEFN IS NOT TRIPPED WHEN THE LINENUM EXCEEDS PAGEL. RATHER, THE **MORE** INTERRUPT IS USED, WHICH IS MORE ACCURATE FOR DETECING THE BOTTOM OF THE SCREEN. WHEN THE TTY REACHES THE BOTTOM OF THE SCREEN, THE ENDPAGEFN FOR THE TTY IS INVOKED; IT RECEIVES AS ARGUMENT THE FILE ON WHICH THE INTERRUPT OCCURRED. HERE ARE SOME NEAT FUNCTIONS FOR USING THE **MORE** FEATURE (THEY LIVE IN ML:GLS;NIFTY QIO): (DECLARE (SPECIAL **MORE** MORE-FLUSH)) (SETQ **MORE** '##MORE##) (SETQ MORE-FLUSH NIL) ;;; TTY-ENDPAGEFN IS AN ENDPAGEFN FOR THE TTY FOR PROCESSING ;;; **MORE** INTERRUPTS. WHAT IT DOES DEPENDS ON TWO ;;; GLOBAL VARIABLES (BOUND BY THE CATCHMORE MACRO): ;;; **MORE** MORE-FLUSH ACTION ;;; NIL NIL NOTHING ;;; NON-NIL NIL "DUMB" MORE PROCESSING; ;;; I.E. PRINT THE VALUE ;;; OF **MORE** AND WAIT FOR ;;; THE LOSER TO TYPE SOMETHING, ;;; BUT NO PROVISION FOR FLUSHING ;;; NIL NON-NIL FLUSH IMMEDIATELY BY DOING ;;; (THROW NIL CLEVER-MORE). ;;; THIS IS GOOD FOR PRINTING ;;; EXACTLY ENOUGH TO FILL A SCREEN. ;;; NON-NIL NON-NIL "SMART" MORE PROCESSING; ;;; I.E. PRINC THE VALUE OF ;;; **MORE** AND WAIT FOR A ;;; CHARACTER. IF SPACE OR ;;; RUBOUT, GOBBLE IT. IF IT ;;; WAS SPACE, JUST RETURN; ;;; OTHERWISE FLUSH BY PRINC'ING ;;; MORE-FLUSH AND DOING ;;; (THROW NIL CLEVER-MORE). (DEFUN TTY-ENDPAGEFN (FILE) (COND (**MORE** (PRINC **MORE**) ((LAMBDA (IFILE) ((LAMBDA (CH) (AND (OR (= CH 40) (= CH 177)) (TYI IFILE)) (COND ((AND MORE-FLUSH (NOT (= CH 40))) (PRINC MORE-FLUSH) (THROW NIL CLEVER-MORE)) (T (CURSORPOS NIL 0 FILE) (CURSORPOS 'L FILE) (CURSORPOS 'T FILE)))) (TYIPEEK NIL IFILE))) (OR (STATUS TTYCONS FILE) T))) (MORE-FLUSH (THROW NIL CLEVER-MORE)))) (ENDPAGEFN T 'TTY-ENDPAGEFN) ;;; (CATCHMORE X Y Z) EVALUATES Z WITH A **MORE** CATCH ;;; AROUND IT. THIS COOPERATES WITH TTY-ENDPAGEFN ;;; TO DO **MORE** PROCESSING. ;;; THUS, FOR EXAMPLE, (CATCHMORE '**MORE** 'FLUSHED ) ;;; WHERE DOES SOME PRINTING WILL PERFORM THE ;;; STANDARD KIND OF **MORE** PROCESSING, FLUSHING ;;; IF A NON-SPACE IS TYPED. ;;; THE MACRODEF MACRO-DEFINER LIVES IN ML:GLS;MACROS >. (MACRODEF CATCHMORE (MOREMSG FLUSHMSG . BODY) (CATCH ((LAMBDA (**MORE** MORE-FLUSH) . BODY) MOREMSG FLUSHMSG) CLEVER-MORE)) (DEFUN DIR FEXPR (X) ;LIST AN ITS FILE DIRECTORY (TERPRI) (CURSORPOS 'C) ((LAMBDA (FILE) (CATCHMORE '|---TYPE SPACE FOR MORE---| '|OH, WELL, SO MUCH FOR THAT...| (DO ((CH (TYI FILE) (TYI FILE))) ((= CH 14)) (TYO CH))) (CLOSE FILE)) (OPEN (CONS (CONS 'DSK X) '(/.FILE/. /(DIR/))))) (ASCII 0)) FASLOADING WITHIN A FASLOAD WORKS PRETTY WELL. NATURALLY, YOU CAN ONLY FASLOAD *BETWEEN* FUNCTION; "EVALUATED CONSTANTS" WITHIN A FUNCTION MAY NOT DO FASLOADS. (IF YOU DON'T UNDERSTAND THIS LAST ITEM, DON'T WORRY.) FORCE-OUTPUT IS AS IN THE MANUAL; IT FORCES AN BUFFER OUT. CLEAR-INPUT AND CLEAR-OUTPUT BOTH EXIST. ON ITS THEY ARE MEANINGFUL ONLY FOR TTY FILES, THOUGH THEY DON'T HURT ON ANY OTHER FILES. THE STATUS CALLS BELOW ARE EQUIVALENT TO THE EXPRESSIONS TO THE RIGHT, AND ARE INCLUDED ONLY FOR COMPATIBILITY WITH OLD I/O. AVOID USING THESE STATUS CALLS IN NEW CODE. NOTE THAT (STATUS UREAD) ETC. RETURNS A NEW I/O NAMELIST, WHICH IS NOT QUITE OF THE SAME FORM AS AN OLD I/O 4-LIST. (STATUS UREAD) <=> (TRUENAME UREAD) (SSTATUS UREAD ...) <=> (UREAD ...) (STATUS UWRITE) <=> (CAR (TRUENAME UWRITE)) (SSTATUS UWRITE ...) <=> (UWRITE ...) (STATUS CRFILE) <=> (CDR (DEFAULTF NIL)) (SSTATUS CRFILE ...) <=> (DEFAULTF '(...)) (STATUS CRUNIT) <=> (CRUNIT NIL) (SSTATUS CRUNIT ...) <=> (CRUNIT ...) FOR COMPATIBILITY WITH OLD I/O, IF THE FILE IS OMITTED IN THE STATUS CALLS BELOW, THE VALUE T (THE STANDARD INITIAL TTY) IS ASSUMED. (STATUS TTY X) HANDS BACK THE TTYST1, TTYST2, AND TTYSTS VARIABLES FOR THE TTY INPUT FILE X AS A LIST OF THREE FIXNUMS. (SSTATUS TTY M N X) SETS THE TTYST1 AND TTYST2 VARIABLES FOR THE TTY INPUT FILE X TO THE FIXNUMS M AND N. (STATUS TTYREAD X) HANDS BACK THE TTYREAD SWITCH FOR THE TTY INPUT FILE X. IF NIL, THEN ONLY FORCE-FEED CHARACTERS CAUSE THE TTY PRE-SCAN FUNCTION TO RETURN WITH ITS BUFFERED LIST OF CHARACTERS. (SSTATUS TTYREAD VAL X) SETS THE SWITCH TO T OR NIL ACCORDING TO VAL. (STATUS LINMODE X) HANDS BACK THE LINMODE SWITCH FOR THE TTY INPUT FILE X. IF T, THEN ONLY CARRIAGE RETURNS CAUSE THE TTY PRE-SCAN FUNCTION TO RETURN WITH ITS BUFFERED LIST OF CHARACTERS. (SSTATUS LINMODE VAL X) SETS THE LINMODE SWITCH. IT ALSO AFFECTS THE ACTIVATION BITS IN THE TTYST1 AND TTYST2 VARIABLES. ---------------------------------------------------------------- THINGS WHICH HAVE DISAPPEARED IN NEW I/O, NOT TO BE IMPLEMENTED ---------------------------------------------------------------- (STATUS INTERRUPT) AND (SSTATUS INTERRUPT) DO NOT EXIST IN NEWIO. (ENDPAGEFN ) IS USED TO SET UP **MORE** INTERRUPTS; (SSTATUS TTYINT) IS USED TO SET FUNCTIONS FOR INTERRUPT CHARACTERS. ALL OTHER INTERRUPT FUNCTIONS ARE THE VALUES OF ATOMIC SYMBOLS, AND SO CAN BE SET UP WITH SETQ. THE NAMES OF THESE VARIABLES ARE: ALARMCLOCK UNDF-FNCTN AUTOLOAD UNBND-VRBL ERRSET WRNG-TYPE-ARG *RSET-TRAP UNSEEN-GO-TAG GC-DAEMON WRNG-NO-ARGS GC-OVERFLOW GC-LOSSAGE PDL-OVERFLOW FAIL-ACT IO-LOSSAGE THE ONLY ONE OF THESE WHICH IS NEW IN NEWIO IS AUTOLOAD, WHICH HOLDS THE AUTOLOAD INTERRUPT HANDLER. LOADARRAYS AND DUMPARRAYS NO LONGER EXIST. A MORE GENERAL NEW I/O PRIMITIVE WILL EVENTUALLY ENABLE THE USER TO WRITE THESE FUNCTIONS FOR HIMSELF (A STANDARD PACKAGE EQUIVALENT TO THE OLD ONES WILL BE PROVIDED). IOC NO LONGER EXISTS IN NEW I/O. USE THE FOLLOWING TABLE OF EQUIVALENCES: (IOC C) <=> (SETQ ^D NIL) (IOC D) <=> (SETQ ^D T) (IOC G) <=> (^G) (IOC Q) <=> (SETQ ^Q T) (IOC R) <=> (SETQ ^R T) (IOC S) <=> (SETQ ^Q NIL) (IOC T) <=> (SETQ ^R NIL) (IOC V) <=> (SETQ ^W NIL) (IOC W) <=> (CLEAR-OUTPUT (SETQ ^W T)) (IOC X) <=> (^X) (IOC Z) <=> (VALRET ':VK/ ) TO INVOKE USER INTERRUPT FUNCTIONS, JUST FUNCALL THEM. IOG NO LONGER EXISTS. INSTEAD OF (IOG NIL ...) SAY INSTEAD ((LAMBDA (^Q ^R ^W) ...) NIL NIL NIL). (STATUS IOC), (SSTATUS IOC) NO LONGER EXIST. THEIR EFFECT CAN BE DUPLICATED BY USING SETQ, FUNCALL, OR THE NEW ^X AND ^G FUNCTIONS. (STATUS TERPRI), (SSTATUS TERPRI) NO LONGER EXIST. TO GET THEIR EFFECT, USE THE LINEL FUNCTION TO SET THE LINEL FOR EACH OUTPUT FILE TO 0. (A LINEL OF ZERO MEANS INFINITY.) (STATUS PAGEPAUSE), (SSTATUS PAGEPAUSE) NO LONGER EXIST. THEY HAVE BEEN SUPERSEDED BY THE **MORE** INTERRUPT FEATURE. 2/7/75 - JONL AND GLS - BRIEF SYNOPSIS: [1] THE VALUE OF PRIN1 CONTROLS USE OF PRIN1 BY LISP. [2] NEW COMPLR SWITCHES, AND DECLARATIONS, AND THINGS: [2A] ^^ NOW ENTERS MAKLAP. [2B] COMPILER-STATE TO DETERMINE STATE OF COMPILER. [2C] EXPR-HASH (E SWITCH) FOR FUNCTION HASHING. [2D] THE GLOBAL VARIABLE "SOBARRAY" HOLDS THE ARRAY POINTER TO THE STANDARD LISP OBARRAY. [2E] EOC-EVAL TO EVAL THINGS AFTER COMPILATION IS COMPLETED. [2F] COUTPUT TO OUTPUT THINGS TO THE LAP FILE. [2G] DONT EVER, BUT EVER, USER "QUOTE" AS A LAMBDA OR PROG VARIABLE. [3] VALUE OF DEFUN CONTROLS EXPR-HASH CROCK IN INTERPRETER. [4] USE PLIST AND SETPLIST TO ACCESS AND STORE PROPERTY LISTS [5] "ROMAN" APPEARS ON THE FEATURE LIST [GOTTEN BY (STATUS FEATURES), OR TESTED BY (STATUS FEATURE ROMAN)] IF THAT HACK IS ASSEMBLED IN. [6] ON A DEC-10 MONITOR, (STATUS JNAME) RETURNS "NNNLSP". [7] _ FIXNUM OUTPUT FORMAT EXTENDED TO _22, _11. [8] (STATUS FREE ...), (SSTATUS FREE ...) FLUSHED. [9] MANY CHANGES TO THE BREAK AND *BREAK FUNCTIONS: [4A] BREAK OF THREE ARGUMENTS NO LONGER EXISTS. [4B] BREAK/*BREAK LAMBDA-BIND *, +, -. [4C] ([S]STATUS BREAKLEVEL) IS LIKE ([S]STATUS TOPLEVEL). [4D] BREAK USES A CATCH; (THROW BREAK) EXITS. ALSO, AN ATTEMPT TO EXPLAIN BREAK AND TOPLEVEL IN EXPR CODE ---------------------------------------------------------------- [1] THE VALUE OF THE ATOM "PRIN1" NOW CONTROLS THE ACTION OF PRINTING BY THE TOP-LEVEL AND BREAK ROUTINES. IN SHORT, AN ITEM X RESULTING FROM THE EVALUATION IN THESE LOOPS IS PRINTED LIKE (COND (PRIN1 (FUNCALL PRIN1 X)) (T (PRIN1 X))) THIS FEATURE EXISTS PRIMARILY FOR THE OWL SYSTEM, WHICH HAS CIRCULAR LIST STRUCTURE ABUNDANT, AND DOESN'T NEED TO REWRITE THE ENTIRE TOP-LEVEL ROUTINE MERELY TO ACCOUNT FOR THE PRINTING OF CIRCULAR STRUCTURE. [2] SOME NEW SWITCHES AND DECLARATIONS FOR THE COMPILER: [2A] TYPING ^^ NOW ENTERS MAKLAP [JUST AS IN MACSYMA, WHERE ^^ DOES A (CONTINUE)]. [2B] COMPILER-STATE THIS VARIABLE REVEALS TO THE USER ONE OF THREE STATES THAT THE COMPILER MAY BE IN, AND IS OF INTEREST TO SOMEONE WHO WANTS TO WRITE SOPHISTICATED MACROS WHICH EXPAND IN DIFFERENT WAYS DEPENDING ON THE REASON FOR THE EXPANSION. POSSIBLE VALUES FOR COMPILER-STATE: [2B1] "TOPLEVEL" THE COMPILER IS AT THE TOP LEVEL OF LISP. [2B2] "MAKLAP" THE COMPILER IS SCANNING AN INPUT FILE LOOKING FOR FUNCTION DEFINITIONS TO COMPILE. IN THIS STATE THE COMPILER WILL EXPAND ANY TOP-LEVEL FORM (FOO ...) FOR WHICH FOO HAS A MACRO PROPERTY TO SEE IF A FUNCTION DEFINITION IS PRODUCED [WHICH WOULD THEN BE COMPILED]. [2B3] "COMPILE" THE COMPILER IS ACTUALLY COMPILING A FORM WHICH IS A FUNCTION DEFINITION, PRODUCING LAP CODE. IN THIS STATE ANY SUB-FORM (FOO ...) WHICH IS TO BE COMPILED IS EXPANDED IF FOO HAS A MACRO PROPERTY. RANDOM EXAMPLE: WHEN A FUNCTION IS DEFINED YOU WANT THE FLATSIZE OF THE DEFINITION TO BE PUT ON THE PROPERTY LIST OF THE FUNCTION. IF THE FUNCTION IS COMPILED, YOU WANT TO ARRANGE TO OUTPUT AN APPROPRIATE DEFPROP INTO THE LAP FILE. (DEFUN STRANGE-DEFUN MACRO (FORM) ;DO THE MACRO THING (NOT HAIRY) (RPLACA FORM 'DEFUN) ;NOW HACK THE FLATSIZE THING (COND ((OR (NULL (BOUNDP COMPILER-STATE)) (EQ COMPILER-STATE 'TOPLEVEL)) ;IF INTERPRETING, OR AT COMPILER TOPLEVEL, ; JUST GO AHEAD AND DO THE PUTPROP (PUTPROP (CADR FORM) (FLATSIZE FORM) 'STRANGE-FLATSIZE)) ((EQ COMPILER-STATE 'MAKLAP) ;IF COMPILING A TOP-LEVEL FORM FROM A FILE, ; ARRANGE FOR A DEFPROP IN THE LAP FILE (COUTPUT (LIST 'DEFPROP (CADR FORM) (FLATSIZE FORM) 'STRANGE-FLATSIZE))) ((EQ COMPILER-STATE 'COMPILE) ;WE DON'T WANT A DEFPROP IN THE ; MIDDLE OF ANY LAP CODE! (ERROR 'STRANGE-DEFUN/ IN/ SUBFORM FORM 'FAIL-ACT)))) [2C] EXPR-HASH THIS FEATURE CONTROLS THE AUTOMATIC OUTPUTTING BY THE COMPILER OF A DEFPROP FOR EACH FUNCTION COMPILED WHICH DEFINES AN "EXPR-HASH" PROPERTY FOR THAT FUNCTION. THIS PROPERTY IS A NUMBER, WHICH IS THE SXHASH OF THE LAMBDA-FORM STORED AS THE EXPR PROPERTY OF THE FUNCTION WHEN USED IN EXPRFORM. THE INTENDED USE OF THIS IS TO HAVE A QUICK, AUTOMATIC SCHEME TO DECIDE WHICH FUNCTIONS HAVE BEEN EDITED SINCE COMPILATION, AND TO READ IN THE EXPR VERSIONS OF THOSE CHANGED FUNCTIONS. STORING THE SXHASH OF THE LAMBDA DEFINITION OF THE FUNCTION LENDS ITSELF TO SIMPLE, QUICK, AND NON-SPACE-CONSUMING (IF NOT COMPLETELY FOOLPROOF) METHODS. IT IS SET EITHER BY A DECLARATION (DECLARE (EXPR-HASH )) OR BY USING THE "E" SWITCH IN THE MAKLAP COMMAND LINE. [SEE ITEM [3] BELOW FOR AN ASSOCIATED CHANGE IN DEFUN.] [2D] SOBARRAY THIS VARIABLE HOLDS A POINTER TO THE STANDARD LISP OBARRAY, IN WHICH THE COMPILER ITSELF IS RESIDENT. "COBARRAY" HOLDS THE ARRAY POINTER TO THE COMPILER'S OBARRAY USED WHILE COMPILING FILES. THESE TWO VARIABLES FACILITATE WRITING OBARRAY-SWITCHING FUNCTIONS. [2E] EOC-EVAL THIS VARIABLE HOLDS A LIST OF FORMS TO BE EVALUATED AFTER COMPILATION OF A FILE HAS BEEN COMPLETED. ONE CAN SET IT FROM A DECLARE, OR USE THE FUNCTION "EOC-EVAL" WHICH CONSES THE ITEMS OF THE CALLING FORM ONTO THE LIST STORED IN EOC-EVAL. AT THE TIME OF COMPLETION OF COMPILATION, (MAPC 'EVAL EOC-EVAL) IS DONE. EOC-EVAL IS RESET BY INITIALIZATION, OR BY THE WHIM OF THE USER. [2F] COUTPUT THIS FUNCTION SHOULD BE USED TO OUTPUT RANDOM FORMS TO THE LAP FILE. THIS IS CURRENTLY DONE BY USING PRINT; THUS ONE USED TO SAY, FOR EXAMPLE (DECLARE (PRINT (LIST 'SETQ 'VERSION (CADR (STATUS UREAD))))) IT IS ANTICIPATED, HOWEVER, THAT EVENTUALLY THE COMPILER MAY NOT WRITE A LAP FILE, BUT WILL BUFFER UP FORMS FOR THE ASSEMBLY PASS. THEREFORE THE FUNCTION COUTPUT SHOULD BE USED INSTEAD: (DECLARE (COUTPUT (LIST 'SETQ 'VERSION (CADR (STATUS UREAD))))) WHICH WILL DO THE CORRECT THING IN THE FUTURE WHEN THE BUFFERING MODE MATERIALIZES. [3] THE VALUE OF THE VARIABLE DEFUN CONTROLS A CROCK IN THE WORKINGS OF THE FUNCTION DEFUN. IF THE VALUE OF DEFUN IS NON-NIL, THEN EVALUATING (DEFUN FOO ...) WILL SUCCEED IN CREATING THE NEW DEFINITION ONLY IF EITHER: [A] FOO HAS NO EXPR-HASH PROPERTY. [B] FOO HAS AN EXPR-HASH PROPERTY, BUT IT IS NOT THE SAME AS SXHASH OF THE LAMBDA FORM FOR THE NEW DEFINITION. THUS A POOR MAN'S WAY TO USE THE COMPILER'S EXPR-HASH FEATURE IS TO COMPILE A FILE WITH THE (E) SWITCH, LOAD IT INTO A LISP, EDIT THE FILE SOME, DO (SETQ DEFUN T), THEN JUST READ IN THE UPDATED SOURCE, AND THE EXPR-HASH SCHEME WILL (PROBABLY) REDEFINE ONLY THOSE FUNCTIONS WHICH HAVE CHANGED, AND LEAVE THE SUBR VERSIONS IN FORCE FOR UNCHANGED FUNCTIONS, PROBABLY. [4] THE NEW SUBR OF ONE ARGUMENT, PLIST, IS USED TO RETRIEVE THE PROPERTY LIST OF A SYMBOL; THIS FUNCTION WORKS ON ALL SYMBOLS INCLUDING NIL, WHEREAS CDR WILL WORK ONLY FOR NON-NULL SYMBOLS IN NON-*RSET MODE. SIMILAR REMARKS HOLD FOR THE NEW SUBR OF TWO ARGUMENTS, SETPLIST. (SETPLIST X (PLIST X)) SHOULD BE A NOOP. [5] IF "ROMAN" IS A FEATURE OF THE LISP YOU ARE USEING, THEN YOU CAN TRY (SETQ IBASE 'ROMAN) OR (SETQ BASE 'ROMAN) FOR FUN AND GAMES; OTHERWISE, NO. [6] IN THE DEC-10 VERSION OF MACLISP, (STATUS JNAME) RETURNS THE ATOMIC SYMBOL "NNNLSP", WHERE NNN IS THE JOB NUMBER IN DECIMAL. THIS IS A STANDARD FIRST FILE NAME FOR TEMPORARY FILES, ETC. [7] TO MAKE THE _ FORMAT OF FIXNUM OUTPUT MORE USEFUL, THE FOLLOWING FORMATS ARE NOW USED [WHEN IBASE IS 8 AND (STATUS _) IS T]: IF THE NUMBER IS SMALLER THAN 2**18., OR IF THE LOW NINE BITS IN THE BINARY REPRESENTATION ARE NOT ALL ZERO, THEN THE _ FORMAT IS NOT USED. IF THE LOW 41 BITS ARE ALL ZERO, THEN N_41 IS USED. IF THE LOW 33 BITS ARE ALL ZERO, THEN N_33 IS USED. IF THE LOW 22 BITS ARE ALL ZERO, THEN N_22 IS USED. OTHERWISE, N_11 IS USED. NOTE THAT THESE CORRESPOND TO QUARTER-WORD BOUNDARIES (EXCEPT N_41); BUT N_11 IS NOT USED IF 6 OR FEWER DIGITS WOULD SUFFICE. [8] (STATUS FREE ...) AND (SSTATUS FREE ...) HAVE BEEN, OR SOON WILL BE, FLUSHED, SINCE THEY ARE OBSOLETE AND MAINLY A PAIN TO MAINTAIN. [9] MANY CHANGES TO THE BREAK FUNCTION: [9A] BREAK OF THREE ARGUMENTS HAS BEEN FLUSHED. (THE THIRD ARGUMENT USED TO BE A FORM TO BE EVALUATED IF P WERE TYPED.) [9B] *BREAK (ERGO ALSO BREAK) NOW LAMBDA-BINDS *, +, AND - TO THEIR OWN CURRENT VALUES SO THAT THEY WILL BE RESTORED ON EXIT FROM THE BREAK. [9C] (STATUS BREAKLEVEL) AND (SSTATUS BREAKLEVEL ) ARE ANALOGOUS TO (STATUS TOPLEVEL) AND (SSTATUS TOPLEVEL ). THE DEFAULT BREAKLEVEL, LIKE THE DEFAULT TOPLEVEL, IS A READ-EVAL-PRINT LOOP WHICH UPDATES *, +, AND - PROPERLY. [9D] BREAK HAS BEEN REDEFINED USING CATCH, WITH A CATCH-TAG OF "BREAK". IF AT ANY TIME WITHIN A BREAK THE FORM (THROW BREAK) IS EXECUTED, THE BREAK (OR *BREAK) FUNCTION WILL BE EXITED, RETURNING . THUS, FOR EXAMPLE, IF ONE TIRES OF TYPING (RETURN '(FOO)) TO UNBND-VRBL BREAKS OR WHATEVER, ONE MIGHT DEFINE A MACRO- CHARACTER (SETSYNTAX '/: 'MACRO '(LAMBDA NIL (THROW (LIST (READ)) BREAK))) AND SIMPLY TYPE :FOO AT THE UNBND-VRBL BREAK TO USE THE VARIABLE FOO INSTEAD. BELOW IS A NEW DEFINITION OF THE BREAK AND *BREAK FUNCTIONS W WRITTEN IN LISP, AS WELL AS A HALF-HEARTED ATTEMPT AT EXPLAINING THE TOP LEVEL LOOP. (DEFUN BREAK FEXPR (X) (*BREAK (EVAL (CADR X)) (CAR X)) ;NOTE ARGUMENT REVERSAL ;;; THE FIRST ARGUMENT TO BREAK IS A SWITCH, WHICH IF NIL CAUSES ;;; IMMEDIATE EXIT WITH NOTHING BEING DONE; ;;; OTHERWISE, THE VARIABLES ^Q, ^W, AND EVALHOOK ARE BOUND ;;; TO NIL, AND THE VARIABLES *, +, AND - ARE BOUND TO THEIR ;;; CURRENT VALUES, AND THE MESSAGE ";BKPT " IS PRINTED. ;;; A READ-EVAL-PRINT LOOP SIMILAR TO THE TOP LEVEL LOOP ;;; IS THEN ENTERED. THIS BREAK LOOP IS SURROUNDED BY AN ;;; ERRSET AND A CATCH. ERRORS MERELY CAUSE THE BREAK ;;; LOOP TO BE RE-ENTERED. ;;; THE VALUE OF (STATUS BREAKLEVEL) SERVES A FUNCTION ;;; SIMILAR TO THAT OF (STATUS TOPLEVEL) IN THE TOP LEVEL ;;; LOOP. ;;; AS EACH FORM IS READ IN THE DEFAULT BREAK LOOP, THERE ARE ;;; FOUR CASES: ;;; [1] END OF FILE. THIS INDICATES OVER-RUBOUT AND ;;; SIMPLY CAUSES A TERPRI. ;;; [2] THE FORM IS THE ATOM P. *BREAK RETURNS NIL. ;;; [3] THE FORM IS (RETURN ). THE FORM ;;; IS EVALUATED AND RETURNED. ;;; [4] OTHERWISE, THE FORM IS EVALUATED AND THE RESULT ;;; PRINTED OUT IN A MANNER ANALOGOUS TO THE TOP ;;; LEVEL READ-EVAL-PRINT LOOP. THE VARIABLES +, -, ;;; AND * ARE UPDATED APPROPRIATELY. (RECALL, HOWEVER, ;;; THAT THEY WERE BOUND ON ENTRY TO *BREAK, AND SO ;;; WILL BE RESTORED EVENTUALLY.) ;;; THE WAY TO RETURN FROM A BREAK IS TO DO A THROW WITH ;;; A TAG OF "BREAK"; THIS WILL RETURN FROM THE CATCH WHICH ;;; SURROUNDS THE BREAK LOOP. THIS IS HOW CASES [2] AND [3] ;;; RETURN THEIR VALUES; CASE [4] MAY ALSO CAUSE A RETURN FROM ;;; THE BREAK. (DECLARE (SPECIAL Q ^W EVALHOOK * + -)) (DEFUN *BREAK (BREAKP BREAKID) (AND BREAKP ((LAMBDA (^Q ^W EVALHOOK * + -) (TERPRI) (PRINC '/;BKPT/ ) (PRINC BREAKID) (SETQ + -) (CATCH (DO NIL (NIL) (ERRSET (DO ((EOF (LIST NIL)) (FORM)) (NIL) (COND ((STATUS BREAKLEVEL) (EVAL (STATUS BREAKLEVEL))) (T (SETQ FORM (READ EOF)) (COND ((EQ FORM EOF) (TERPRI)) ((EQ FORM 'P) (THROW NIL BREAK)) ((EQ (CAR FORM) 'RETURN) (THROW (EVAL (CADR FORM)) BREAK)) (T (SETQ - FORM) (SYSPRINT (SETQ * ((LAMBDA (+) (EVAL FORM)) (PROG2 NIL + (SETQ + -))))) (TERPRI)))))))) BREAK) (OR (STATUS LINMODE) (TERPRI))) NIL NIL NIL * + -))) (DEFUN SYSPRINT (X) ;INTERNAL PRINTING FUNCTION (OR (STATUS LINMODE) (TERPRI)) (COND (PRIN1 (FUNCALL PRIN1 X)) (T (PRIN1 X))) (TYO 40)) (DEFUN STANDARD-TOP-LEVEL NIL (PROG (^Q ^W ^R EVALHOOK BASE IBASE ...) ERRS ;ERRORS, UNCAUGHT THROWS, ETC. COME HERE (RESET-BOUND-VARS) ^G ;^G QUITS COME HERE (RESET-INTERNAL-TOP-LEVEL-VARS) (RESTORE-THE-WORLD) (DO-DELAYED-INTERRUPTS) ;RECALL THAT ERRORS DO (SETQ // ERRLIST) SO LAMBDA-BINDING ERRLIST WORKS (MAPC (FUNCTION EVAL) //) (AND (STATUS LINMODE) (TERPRI)) (SETQ * '*) (DO ((EOF (LIST NIL))) (NIL) (RESET-INTERNAL-TOP-LEVEL-VARS) (SETQ * (COND ((STATUS TOPLEVEL) (EVAL (STATUS TOPLEVEL))) (T (SYSPRINT *) (TERPRI) (DO ((FORM (READ EOF) (READ EOF))) ((NOT (EQ FORM EOF)) (SETQ - FORM)) (TERPRI)) ((LAMBDA (+) (EVAL -)) (PROG2 NIL + (SETQ + -))))))))) (DEFUN RESTORE-THE-WORLD NIL (RESET-THE-PDLS) (SETQ ^Q NIL) (SETQ EVALHOOK NIL) (RESTORE-THE-IO-SYSTEM) (ENABLE-SYSTEM-INTERRUPTS) (RESET-INTERNAL-GC-MARK-BITS)) (DEFUN DO-DELAYED-INTERRUPTS NIL (OR INTERNAL-NOINTERRUPT-SWITCH (PROCESS-PENDING-ALARMCLOCK-AND-TTY-INTERRUPTS))) 12/8/74 JONL & GLS Remember, BIBOP LISP is now the standard system LISP! [As of version number 958]. LISTARRAY has been extended to be an LSUBR. an optional second argument puts a bound on the number of elements to LISTIFY. For example, (LISTARRAY ary 5) lists only the first five elements of ary; while (LISTARRAY ary), as before, lists all elements. note that (LISTARRAY ary (APPLY 'TIMES (CDR (ARRAYDIMS ary)))) also lists all elements. MAKOBLIST, MAKREADTABLE, and BLTARRAY have been flushed. If you used them before, you can substitute calls as in the table below: FOR THIS CODE USE THIS INSTEAD (BLTARRAY x y) (FILLARRAY Y X) ;note reversal of args (MAKREADTABLE x) (*ARRAY x 'READTABLE) x not T or NIL (MAKREADTABLE t-or-nil) (*ARRAY (GENSYM) 'READTABLE t-or-nil) (MAKOBLIST x) (*ARRAY x 'OBARRAY) x not NIL (MAKOBLIST NIL) (LISTARRAY OBARRAY (- (CADR (ARRAYDIMS 'OBARRAY)) 129.)) Note that FILLARRAY is consistent in that it always transfers the contents of its second arg into the first, and returns the first (an array). Note too that this means that when replacing a BLTARRAY by a FILLARRAY, you must reverse the args. SYMEVAL lives! If you know that you are evaluating an atomic symbol, it will be faster to use SYMEVAL rather than the general-purpose EVAL. In particular, as soon as BIBOP LISP becomes the settled standard, SYMEVAL will compile optimally into two instructions. In *RSET mode, all car-cdr calls are checked at each level to see that CAR or CDR is applied only to proper data. This checking is not done by compiled code [which usually open-codes car-cdr ings] [this is not really true, because compiled code calls functions like CDDDDR, even if the user does not explicitly use them], nor when *RSET = NIL. CAR and CDR are variables which control the checking as follows: LIST can hack only lists NIL can hack lists and NIL SYMBOL can hack lists, NIL, and symbols T can hack anything. When in *RSET mode, the value of CDR controls the permissible operations for the function CDR, and the value of CAR controls the permissible operations for the function CAR. FRIDAY SEPT 13,1974 LQ+4D.19H.41M.28S. LISP 909 - GLS - BRIEF SYNOPSIS: [1] NEW FUNCTION: FSC. SIMILAR TO LSH AND ROT. [2] NEW STATUS OPTION: (STATUS TTYSIZE). [3] REMPROP CHANGED TO RETURN USEFUL QUANTITY. [4] ISQRT HAS BEEN FLUSHED. CODE BELOW SUPERSEDES IT. [5] (EXPT X .5) IS INHERENTLY LESS ACCURATE THAN (SQRT X). [6] FASLOAD FILES CAN BE CONCATENATED. [7] (IOC W) PROBLEM EXTENDS TO IOG. GRUMBLE. BEWARE! ---------------------------------------------------------------- [1] NEW FUNCTION: FSC IS ANALOGOUS TO ROT AND LSH. IT ACCEPTS EITHER FIXNUMS OR FLONUMS, AND ACTS UPON THE BITS GIVEN IT; I.E. LIKE ROT AND LSH IT DOES NOT DO THE FLOAT OR FIX FUNCTION. UNLIKE ROT AND LSH, HOWEVER, FSC RETURNS A FLONUM. NOTE THAT THE FSC PDP-10 INSTRUCTION NORMALIZES THE RESULT. THIS IS A PDP-10 DEPENDENT FUNCTION! (FSC N 0) IN PARTICULAR IS INTENDED TO BE THE INVERSE OF (LSH N 0); NAMELY, IT TAKES A FIXNUM AND MAKES THE BITS OF THAT FIXNUM INTO A FLONUM (THAT IS, IT USES THE FIXNUM AS THE MACHINE REPRESENTATION OF THE FLONUM). IN GENERAL, (= F (FSC (LSH F 0) 0)) FOR ANY FLONUM F, BUT (= X (LSH (FSC X 0) 0)) FOR FIXNUM X IFF X IS THE REPRESENTATION OF A *NORMALIZED* PDP-10 FLONUM. [2] (STATUS TTYSIZE) RETURNS A DOTTED PAIR OF THE TTY'S CURRENT HEIGHT AND WIDTH (ANALOGOUS TO CURSORPOS OF NO ARGS). THESE ARE THE PARAMETERS AS RETURNED BY THE SYSTEM, WHICH PRESUMABLY ARE SETTABLE VIA :TCTYP. [3] REMPROP, IF IT FINDS THE PROPERTY TO REMOVE, INSTEAD OF RETURNING T, RETURNS THE CELL OF THE PROPERTY LIST WHOSE CAR IS THE PROPERTY (THIS CELL WAS SPLICED OUT FROM THE PROPERTY LIST). [4] ISQRT HAS BEEN FLUSHED FROM THE LISP SYSTEM. THE LISP CODE BELOW IS MORE ACCURATE AND WORKS ON BIGNUMS. (DEFUN BSQRT (N) (BSQRT1 (ABS N) (EXPT 2 (// (1+ (HAULONG N)) 2)))) (DEFUN BSQRT1 (N GUESS) ((LAMBDA (NEXT) (COND ((LESSP NEXT GUESS) (BSQRT1 N NEXT)) (T GUESS))) (*QUO (*PLUS GUESS (*QUO N GUESS)) 2))) THIS IS ESSENTIALLY A NEWTON ITERATION (DUE TO GOSPER) WITH APPROPRIATE PRECAUTIONS FOR INTEGER TRUNCATION. [5] (EXPT X .5) IS INHERENTLY LESS ACCURATE THAN (SQRT X). USE THE LATTER WHEN YOU KNOW IT'S SQRT. [6] IF YOU CONCATENATE SEVERAL FASLOAD FILES SO THAT THE BEGINNING *FASL* OF THE NEXT FOLLOWS THE TERMINATING *FASL* OF THE PREVIOUS ONE, THEN FASLOAD WILL GO 'ROUND THE FASLOAD CYCLE AGAIN AND LOAD IT UP TOO. CURRENTLY THERE IS NO CONVENIENT WAY TO CONCATENATE FASLOAD FILES, BUT I NEVER PROMISED YOU A ROSE GARDEN. [7] REMEMBER THE (IOC W) BUG, GANG? IT STILL HAUNTS US! NAMELY, (IOC W) RESETS THE TTY OUTPUT BUFFER, THUS POSSIBLY LOSING CHARACTERS FROM THE PREVIOUS OUTPUT FUNCTION. THE RIGHT WAY TO DO IT IS (SETQ ^W T). WELL, IT FOLLOWS THAT (IOG W ) ISN'T THE RIGHT THING EITHER. THE RIGHT THING IS (IOG NIL (SETQ ^W T) ). I DON'T LIKE IT EITHER. [8] POOR SIGNP! AUG 17, 1974 LISP 893 - GLS AND JONL - [1] A NEW LAP, INCOMPATIBLE WITH OLDER LISPS, IS STANDARD [2] NEW FUNCTIONS: ^, ^$. EXPT EXTENDED. [3] NEW EDITOR COMMANDS: SS, RS, PC. [4] BOUNDP HAS BEEN CHANGED TO SAVE CONSING. [5] ERRFRAME HAS BEEN CHANGED TO GIVE OUT MORE INFO. [6] THROWING OUT OF A TTY INTERRUPT CAN LEAD TO LOSSAGE. [7] DONT USE (IOC W) IF YOU REALLY WANT (SETQ ^W T). [8] NCOMPLR RECOGNIZES "COMPLR (INIT)" FILES. [9] IN LISP, YOU CAN NOW (SETQ IBASE 'ROMAN). DITTO FOR BASE. ---------------------------------------------------------------- [1] LAP 81 IS THE STANDARD LAP NOW, AND IS WHAT YOU GET BY AUTOLOAD. SINCE IT WILL NOT WORK IN LISPS WITH VERSION NUMBERS LESS THAN 892, YOU WILL HAVE TO RETRIEVE THE OLDER LAP EXPLICITLY IF YOU NEED IT. DO (FASLOAD LAP OFASL COM) BEFORE TRYING TO USE LAP IN AN OLDER LISP. LAP NOW USES THE VALUE OF THE VARIABLE FASLOAD IN THE SAME WAY FASLOAD ITSELF DOES: IF IT IS NIL, THEN MESSAGES ABOUT FUNCTIONS REDEFINITIONS ARE SUPPRESSED. ALSO, LAP NOW TRIES TO DO PURE LOADINGS WHEN THE VALUE OF "PURE" IS NON-NIL. [2] NEW FUNCTIONS: ^ TAKES TWO FIXNUMS A AND B, AND RETURNS A TO THE B'TH POWER AS A FIXNUM (MODULO 2^35.). WILL NOT DO BIGNUM ARITHMETIC. ^$ TAKES A FLONUM AND A FIXNUM, RETURNING A FLONUM. EXPT HAS BEEN EXTENDED. IF THE EXPONENT IS A FLONUM, THEN THE BASE IS CONVERTED TO A FLONUM, AND THEN THE FORMULA B (B LOG A) A = E IS USED, USING THE LOG AND EXP FUNCTIONS. [3] NEW COMMANDS FOR THE BINFORD EDITOR: SS (SAVE SPOT) GOBBLES THE NAME OF AN ATOMIC SYMBOL, AND SETQ'S IT TO THE CURRENT EDITOR CONTEXT. RS (RESTORE SPOT) GOBBLES SUCH A SETQ'D ATOMIC SYMBOL AND MAGICALLY MOVES THE EDITOR'S CURSOR TO THE SAVED SPOT. PC (PRINT CONTEXT) GOBBLES UP TO TWO FLONUMS (TERMINATE WITH $$) AND, USING THEM FOR THE PRINLEVEL AND PRINLENGTH, PRINTS THE CURRENT LEVEL OF LIST STRUCTURE. IF YOU DON'T SUPPLY TWO ARGS, DEFAULTS OF 4 ARE USED. [4] BOUNDP IS NOW A PURE PREDICATE; IT RETURNS T OR NIL. ONE CAN GET THE OLD EFFECT OF BOUNDP BY SAYING (AND (BOUNDP X) (CONS NIL (EVAL X))). THERE WILL SOOON BE A SPECIAL FUNCTION FOR OBTAINING THE VALUE OF A SYMBOL, WHICH WILL RUN A LITTLE FASTER THAN "EVAL", AND WHICH WILL COMPILE QUITE OPTIMALLY. THUS, (AND (BOUNDP X) (SYMEVAL X)) WILL COMPILE INTO MUCH FASTER CODE THAN THE WILL THE CURRENT FORM: (AND (SETQ FOO (BOUNDP X)) (CDR FOO)) [5] ERRFRAME HAS BEEN CHANGED TO GIVE YOU MORE INFORMATION. FORMERLY THE THIRD ITEM OF THE RETURNED LIST WAS THE ERROR MESSAGE ONLY. NOW IT IS A LIST OF FROM ONE TO THREE THINGS. IF IT IS ONE THING, IT IS THE ERROR MESSAGE. YOU CAN PRINC THIS TO RE-CREATE THE ERROR PRINTOUT. IF THERE ARE TWO THINGS, THE FIRST IS THE MESSAGE AND THE SECOND IS THE LOSING ITEM. IF THERE ARE THREE THINGS, THEY ARE THE ERROR MESSAGE, THE LOSING ITEM, AND THE TYPE OF ERROR (E.G. FAIL-ACT OR UNBND-VRBL). IN SHORT, YOU GET A LIST OF THINGS SUCH THAT (APPLY 'ERROR (CADDR (ERRFRAME NIL))) WILL RE-CREATE THE SAME ERROR! [6] PEOPLE HAVE BEEN WRITING TTY INTERRUPT FUNCTION LIKE (SSTATUS INTERRUPT 15. '(LAMBDA NIL (THROW NIL TO-TOP-LEVEL))). THERE IS A DANGER IN THIS: RECALL THAT WHEN A TTY USER INTERRUPT IS RUN, THE SYSTEM DOES AN IMPLICIT (NOINTERRUPT 'TTY) FOR YOU TO PREVENT TIMING ERRORS. IF YOU EXIT THE USER INTERRUPT ABNORMALLY, YOU MUST RESET NOINTERRUPT YOURSELF. (SSTATUS INTERRUPT 15. '(LAMBDA NIL (NOINTERRUPT NIL) (THROW NIL TO-TOP-LEVEL))) ALTERNATIVELY, THE TOP LEVEL COULD SAY (NOINTERRUPT NIL) AFTER CATCHING THE THROW, POSSIBLY A SAFER ALTERNATIVE IN SOME CASES. [7] LOSERS NOTE: (IOC W) IS NOT THE SAME AS (SETQ ^W T). IN GENERAL, WHEN YOU JUST WANT TO SET AN I/O SWITCH, USE SETQ UNLESS YOU ARE AWARE OF THE SIDE EFFECTS INVOLVED. (IOC W) IN PARTICULAR PERFORMS A SYSTEM (= ITS) I/O RESET, CLEARING THE TTY OUTPUT BUFFER. IF ANY CHARS ARE PENDING IN THE BUFFER FOR OUTPUT FROM THE PREVIOUS PRINT, THEY WILL BE FLUSHED. THUS (PROG2 (PRINC 'FOOBAR) (IOC W)) IS VERY LIKELY NOT TO PRINT ANYTHING AT ALL! OR MAYBE JUST THE "F" IF YOU ARE LUCKY. (PROG2 (PRINC 'FOOBAR) (SETQ ^W T)) DOES WHAT YOU WANT AND LETS THE "FOOBAR" PRINT OUT. [8] NCOMPLR WILL LOOK FOR A "COMPLR (INIT)" FILE WHEN IT IS STARTED UP, AND IF FOUND, WILL UREAD AND READ-EVAL IT IN. YOU CAN FASLOAD OTHER FILES FROM THIS INIT FILE, BUT CURRENTLY CANNOT UREAD OTHER FILES. THE INIT FILE MAY BE EITHER ON YOUR DIRECTORY, OR ON THE "(INIT)" DIRECTORY. MONDAY JULY 29,1974 FQ+3D.1H.24M.28S. LISP 873 - GLS - THIS LISP RECENT IS SHORT, BUT ITEM [2] IS OF GREAT IMPORTANCE. THE PREVIOUS LISP RECENT APPEARS AT THE END OF THIS ONE SINCE IT HASN'T BEEN AROUND FOR VERY LONG. BRIEF SYNOPSIS: [1] *RSET-TRAP FUNCTION IS ALWAYS RUN AND MUST CHECK *RSET ITSELF [2] (CAR NIL) AND (CDR NIL) ARE ALWAYS NIL [3] DUMPARRAYS/LOADARRAYS NOW KNOW ABOUT FIXNUM AND FLONUM ARRAYS ---------------------------------------------------------------- [1] THE *RSET-TRAP USER INTERRUPT IS ALWAYS RUN WHEN AN UNCORRECTABLE ERROR IS ABOUT TO POP BACK TO TOP LEVEL OR TO AN ERRSET. IT IS UP TO THE *RSET-TRAP FUNCTION TO CHECK THE *RSET SWITCH FOR ITSELF (THE SYSTEM-SUPPLIED *RSET-TRAP FUNCTION INDEED DOES THIS). [2] FOR COMPATIBILITY WITH INTERLISP (FOO), THE CAR AND CDR OF NIL ARE ALWAYS BUT ALWAYS NIL. NIL STILL HAS A PROPERTY LIST, AND GET AND PUTPROP STILL WORK ON IT, BUT NIL'S PROPERTY LIST IS NOT ITS CDR (CROCK, CROCK). THE CLAIM IS THAT ONE CAN WRITE CODE SUCH AS (CADDR X) INSTEAD OF THE MORE TIME- AND SPACE-CONSUMING (AND (CDR X) (CDDR X) (CADDR X)) AND SO ON. SEND COMPLAINTS TO GLS, BUT I DOUBT IT WILL DO YOU ANY GOOD. [3] DUMPARRAYS AND LOADARRAYS WILL NOW DO THE CORRECT THING WITH FIXNUM AND FLONUM ARRAYS. OLD DUMPARRAYS FILES ARE STILL GOOD - THE HACK IS UPWARD COMPATIBLE. FRIDAY JULY 19,1974 NM+8H.29M.40S. LISP 861 - GLS - BRIEF SYNOPSIS: [1] NEW FUNCTIONS: UPROBE, UCLOSE, UAPPEND [2] DEFPROP NOW DOES REMPROP FIRST, AS DEFUN ALWAYS HAS [3] (NOINTERRUPT 'TTY) - NEW NOINTERUPT OPTION [4] PDLFRAME HAS DISAPPEARED - USE EVALFRAME [5] (SSTATUS CRFILE ...) SETS UREAD FILE NAME DEFAULTS [6] VALUE OF // INTERACTS WITH ERRLIST; *, +, - MENTIONED [7] ONE MAY THROW OUT OF A USER INTERRUPT NOW [8] APPLYFRAMES WIN BETTER - FEAR NOT [9] UNPURIFY$G DEPURIFIES ALL PAGES - PURIFY$G WILL REPURIFY THEM [:] COMPLR/NCOMPLR HAVE PRIVATE OBARRAY AS WELL AS READTABLE [;] MIDAS AND FASLOAD COOPERATE ---------------------------------------------------------------- [1] THREE NEW FUNCTIONS FOR OLD I/O: [1A] UPROBE TAKES ARGUMENTS LIKE UREAD, AND TRIES TO FIND THE FILE SPECIFIED. IF IT EXISTS, UPROBE RETURNS THE ACTUAL FILE NAMES; IF NOT, IT RETURNS NIL. [1B] UCLOSE (OF NO ARGUMENTS) CLOSES THE UREAD INPUT CHANNEL. THIS IS PRIMARILY OF USE BEFORE CALLING THE SUSPEND FUNCTION. [1C] UAPPEND (ARGUMENTS LIKE UREAD) OPENS THE SPECIFIED FILE, WHICH MUST ALREADY EXIST, FOR WRITING. THE FILE IS RENAMED TO BE ".LISP. APPEND", AND BECOMES NON-ACCESSIBLE (YOU SEE A * NEXT TO IT IN THE DIRECTORY). ANY OUTPUT DIRECTED TO THE UWRITE OUTPUT CHANNEL (THE ^R SWITCH) IS THEN OUTPUT TO THIS FILE, APPENDED TO THE PREVIOUS CONTENTS. WHEN THE FILE IS EVENTUALLY CLOSED WITH UFILE, IT WILL TAKE ON THE FILE NAMES SPECIFIED BY UFILE, AND WILL CONTAIN ITS OLD CONTENTS WITH THE NEW MATERIAL TACKED ONTO THE END. NOTE THAT UAPPEND IS REALLY MORE LIKE NCONC THAN APPEND! I.E. IT DOES NOT COPY THE FILE, BUT ADDS ONTO THE EXISTING ONE, CLOBBERING IN NEW DATA. [2] DEFPROP USED TO BE DESCRIBED AS (DEFUN DEFPROP FEXPR (X) (PUTPROP (CAR X) (CADR X) (CADDR X))) THANKS TO AGITATION BY CERTAIN PARTIES, IT IS NOW (DEFUN DEFPROP FEXPR (X) (REMPROP (CAR X) (CADDR X)) (PUTPROP (CAR X) (CADR X) (CADDR X))) THAT IS, DEFPROP IS GUARANTEED TO PUT THE NEW PROPERTY AT THE HEAD OF THE PROPERTY LIST. NOTE THAT DEFUN HAS DONE SUCH REMPROPING IN THE PAST ALREADY. [3] NOINTERRUPT HAS BEEN EXTENDED TO HAVE THREE STATES: (NOINTERRUPT T) CAUSES ALL ASYNCHRONOUS USER INTERRUPTS TO BE DELAYED (AS BEFORE; "ASYNCHRONOUS" INTERRUPTS ARE PRESENTLY TTY CONTROL CHARS AND THE ALARMCLOCK) (NOINTERRUPT NIL) LETS SUCH INTERRUPTS GO THROUGH IMMEDIATELY (THE INITIAL STATE); ANY DELAYED INTERRUPTS ARE RUN DURING THIS CALL. *** (NOINTERRUPT 'TTY) CAUSES ONLY TTY INTERRUPTS TO BE DELAYED, AND LETS OTHERS GO THROUGH. IN THIS WAY ONE CAN SUPPRESS ^G QUITS, ETC., BUT STILL ALLOW CLOCK INTERRUPTS. [4] PDLFRAME, A SYNONYM FOR EVALFRAME, HAS DISAPPEARED. USE EVALFRAME FROM NOW ON. [5] (SSTATUS CRFILE FOO BAR) WILL SET THE UREAD FILE NAME DEFAULTS TO "FOO BAR". (STATUS CRFILE) READS THEM, AS BEFORE. [6] THE ATOM // IS NOW A VARIABLE, USED IN CONJUNCTION WITH ERRLIST. WHEN AN ERROR PROPAGATES BACK TO TOP LEVEL, THEN WHERE THE TOP LEVEL FORMERLY DID (MAPC (FUNCTION EVAL) ERRLIST) IT NOW DOES INSTEAD (MAPC (FUNCTION EVAL) //) AND WHEN AN ERROR OCCURS, THEN (SETQ // ERRLIST) IS PERFORMED. THUS THIS NEW MECHANISM WORKS ALMOST LIKE THE OLD, WITH ONE IMPROVEMENT (SUGGESTED MY MACRAKIS): ONE CAN LAMBDA-BIND ERRLIST OVER A COMPUTATION, AND IF AN ERROR OCCURS THE CURRENT ERRLIST WILL BE USED AND NOT THE TOP-LEVEL ERRLIST. THIS MAY SOMETIMES BE A DESIRABLE ALTERNATIVE TO ERRSET. RECALL AGAIN THAT *, +, AND - ALSO HAVE MEANINGFUL VALUES: * CONTAINS THE LAST THING TYPED OUT BY LISP'S TOP LEVEL. THUS IF YOU FORGOT TO TYPE A SETQ AROUND THE PREVIOUS FORM, YOU CAN STILL RETRIEVE THE RESULTANT VALUE. + CONTAINS THE LAST THING READ BY LISP'S TOP LEVEL. THIS IS USEFUL IN CASE OF A TYPING ERROR; YOU CAN SAVE THE FORM AND MAYBE EDIT IT. - CONTAINS THE CURRENT THING READ BY THE TOP LEVEL (WHEN EVALUATION OF THE THING IS COMPLETED, THEN SOMETHING LIKE (SETQ + -) HAPPENS). NOTE THAT ERROR BREAKS SAVE +, SO THAT IF YOU SAY: (PLUS 3 'A) ;LOSEY LOSEY A NON-NUMERIC VALUE ;LISP COMPLAINS ;BKPT WRNG-TYPE-ARG (PLUS 3 5) ;DO SOME STUFF IN THE BREAK 10 $P ;RETURN FROM BREAK A NON-NUMERIC VALUE ;LISP GRIPES AGAIN (SETQ FOO +) ;NOW SAVE VALUE OF + (PLUS 3 'A) ;IT IS FORM THAT LOST [7] FORMERLY USER INTERRUPTS WERE AN IMMOVABLE WALL WITH RESPECT TO THROWS; NOW THEY ARE TRANSPARENT. THIS MEANS THAT YOU CAN THROW OUT OF A USER INTERRUPT IN THE OBVIOUS MANNER. EXAMPLE: (SSTATUS INTERRUPT 0 '(LAMBDA (X) (THROW NIL ABORT)) (CATCH (HAIRY-COMPUTATION) ABORT) ;HAIRY MESS IN THIS WAY ONE CAN ABORT THE HAIRY MESS BY TYPING ^@. [8] SOME PEOPLE HAVE COMPLAINED OF SUPER-SLOWNESS WHEN RUNNING IN *RSET MODE. THIS WAS DUE TO FAULTY DESIGN IN THE APPLYFRAME ROUTINES, WHCIH CAUSED CONSING ON EVERY FUNCTION CALL. THIS HAS BEEN CORRECTED, SO DON'T FEAR TO USE *RSET MODE NOW. [9] UNPURIFY$G TO A LISP OR BLISP WILL UNPURIFY ALL PURE PAGES IN THE LISP BY COPYING THEM. THIS IS PRIMARILY SO THAT JPG CAN WIN WHEN DUMPING MACSYMA. PURIFY$G WILL THEN REPURIFY THE (COPIED) PAGES. [:] NCOMPLR WINS WITH ARRAYCALL NOW, BUT COMPLR DOES NOT. ALSO, BOTH COMPLR AND NCOMPLR HAVE A PRIVATE OBARRAY AS WELL AS READTABLE (CALLED COBARRAY AND CREADTABLE). [;] GREENBLATT (RG) HAS HACKED MIDAS SO THAT IT CAN PRODUCE FASL FORMAT OUTPUT; THUS ONE CAN USE ALL THE MACRO FEATURES TO PRODUCE CODE TO LOAD INTO LISP. THE FOLLOWING IS A COPY OF AI:MIDAS;FASL > WRITTEN BY RG. FASL Feature In Midas. Midas can now assemble FASL files that can be loaded by LISP in the same manner as LAP FASL output. This mode is entered by the .FASL pseudo op, which must appear at the beginning of the file before any storage words. After .FASL has been seen, the assembly becomes a two pass relocatable assembly. However, certain restrictions and "changes of interpretation" apply. Global symbols (declared as usual with " or .GLOBAL) are persmissible. However, since the output is to be loaded with FASLOAD using DDT's symbol table instead of STINK, there are quite a few differences in detail. For symbols defined within the current assembly, the only effect of being declared GLOBAL is that the GLOBAL information is passed on to FASL when the symbol table is written at the end of pass 2. This in combination with the SYMBOLS switch in FASLOAD determines whether the symbol gets loaded into DDT's symbol table. If SYMBOLS is NIL, no symbols will be loaded; if SYMBOLS is EQ to SYMBOLS, only globals will be loaded; and if SYMBOLS is T, all symbols (local and global) will be loaded. Once the symbol is loaded (or not), the information as to its GLOBALness is lost and, of course, makes no further difference. The initial state when LISP is loaded is NIL. GLOBAL symbols not defined in the current assembly are also legal, but there are additional restrictions as to where in a storage word they may appear and what masking may be specified (as compared to a normal relocatable assembly). Briefly, they may appear as in a storage word as a full word, a right half, a left half, or an accumulator. They may be negated, but can not be operated on with any other operator. Error printouts will be produced if they appear elsewhere. When the symbol is encountered by FASLOAD, DDT's symbol table is consulted. If it is defined at that time, OK, otherwise FASLOAD will generate an error. Any sort of global parameter assignment or location assignment is Forbidden. .LOP, .LVAL1, .LVAL2, etc are not available. New Pseudo OPs Available only in FASL assemblies. The following pseudos are available to facilitate the communication between MIDAS assembled programs and LISP (particularily with regard to list structure). .ENTRY function type args Function is an atom and is taken as the name of a function beginning at the current location. Type should be one of SUBR, FSUBR or LSUBR, and has the obvious interpretation. Args is a numeric-valued field which is passed thru to FASLOAD and used to construct the args property of the function. If it is zero, no args property is created. Otherwise it is considered to be a halfword divided into two 9 bit bytes, each of which is converted as follows: byte result 0 nil 777 777 otherwise n n-1 These two items are then CONSed and from the args property. The following pseudos may appear in constants!! .ATOM atom followed by a LISP atom in "MIDAS" format (see below). May only appear in right half (or entire word) of a storage word. Assembles into a pointer to the atom header of the specified atom. .SPECI atom similar to .ATOM but assembles into a pointer to the SPECIAL value cell of the specified atom. .FUNCT atom similar to .ATOM, but invokes special action by FASLOAD in case the PURESW is on. Normally used in function calls. Briefly, if FASLOAD is going to purify the function it is loading, it must "snap the links" first. If .FUNCT is used, the location will be examined by FASLOAD and the link snapped if possible before purification. Typical usage: CALL 2,.FUNCT EQUAL ;calls equal as a function of 2 args ; note: the CALL is not defined ; or treated specially by MIDAS. .ARRAY atom similar to .ATOM, but assembles into a pointer to the Array SAR. .SX S-expression similar to .ATOM, but handles a LISP S-expression. (See below). .SXEVA S-expression reads S expression. This S expression is EVALed (for effect presumably) at FASLOAD time. The resulting value is thrown away. Does not form part of storage word. .SXE S-expression Similar to .SX but list is EVALed at FASLOAD time. The resulting value is assembled into storage word. The MIDAS "LISP READER" By a conspiracy between MIDAS and FASLOAD, a version of the LISP reader is available. However, due to historical reasons (mostly, i.e. the FASLOAD format was originally intended only to deal with COMPLR type output), there are a number of "glitches" (see below for list). These will probably tend to go away in the fullness of time. a) numeric ATOM The first character of a LISP atom is examined specially. If it is a # or &, the atom is declared to be numeric and either fixed (#) or floating (&). Midas then proceeds to input a normal numberic field (terminated, note, by either space or comma). This value is then "stored" in the appropriate "space" (fixnum space or flonum space). b) other ATOMs (also known as PNAME atoms or (LISP) SYMBOLS) If the first character of the atom is not # or &, the atom is a "PNAME" atom. / becomes a single character quote character as in LISP. The atom may be indefinitely long. The atom will be terminated by an unquoted space, carrige return, tab, (, ), or semicolon. Unquoted linefeeds are ignored and do not become part of the atom. The character that terminates the atom is "used up" unless it is a ( or ). Note that period is a legal constituent of a atom and does not terminate it or act specially. c) lists. Work normally, but note following caution relative to dot notation: . does not terminate atoms. Thus, to invoke dot notation, the dot must be left delimited by a space, tab, parenthesis, or other character that does terminate atoms. Glitches: 1) Restriction on pass dependant list structure -- In any list reading operation, no new atoms not previously encountered may be encountered for the first time on pass 2. However, this restriction does not apply to atom-only reading operations (.ATOM, .SPECI, .FUNCT etc). 2) Single quote for quoting does not exist (no other macro characters exist either.) 3) Numbers must be flagged as above always. MOVEI A,.ATOM 123 ;LOSES - gives pointer ; to PNAME type atom ; with PNAME 123. it is ; not numeric. use: MOVEI A,.ATOM #123 ;WINS 4) No provision exists to reference "GLOBALSYMS" in FASLOAD. This mostly means only that DDT must be present to load a MIDAS assembled FASL file. (some simple COMPLR and LAP FASL files can successfully be FASLOADed by, for example, a disowned LISP running without a DDT. 5) LOC is illegal in a FASL assembly. BLOCK of a non-relocatable quantity is ok. 6) Currently, symbol loading is VERY slow. Thus use SYMBOLS nil, (the initial state) unless symbols are necessary. 7) Midas does not know about any LISP symbols or UUOs specially. Use them as globals until someone gets around to fixing up a .INSRT file with the appropriate defs. 8) .ATOM "should" be a special case of .SX . However, it is handled separately because of the following "reasons": a) The previously noted restriction on pass dependent LISTS. b) Midas can do constants optimization on atoms ppearing in constants (on both pass one and pass two) but not on LISTS. Therefore, each list is guaranteed to take a separate word in the constants area even if it is identical to some other list which also appears in a constant. c) Each list takes an additional entry in FASLOAD's "atom" table. This is a temporary table that is flushed after the FASLOADing is complete. Of course, .SX still works for atoms modulo the above noted restrictions and inefficencies. 5/22/74 JONL Brief Synopsis: for LISP 838 and greater 1) SUSPEND - new function, LSUBR of 0 or 1 arguments, like MACDMP, but can continue where the computation left off, rather than restarting at top level. 2) MUNKAM is the inverse of MAKNUM. On the PDP10 system, is pretty much the same as CDR, except that the argument is required to be a fixnum, and the COMPLRs will open-code MUNKAM. 3) RANDOM will accept two arguments, as a means of "seeding" it. Also, a slight deficiency has been noted. 4) A programmable features list for (STATUS FEATURE foo), and an aid, (SSTATUS LINMODE T), for systems with line rather than character oriented TTY input. 5) ARRAYCALL, SUBRCALL, AND LSUBRCALL are now all FSUBRs, and take an extra argument to aid NCOMPLR in open-coding these applications. Disregard any previous notes on these functions, and note well below. 6) Examples of some particularly useful lisp macros, especially for users of ARRAYCALL, SUBRCALL, and LSUBRCALL. 7) The compiler declaration ARRAY* has been extended to allow information about the ranges of indices. Also, NCOMPLR now uses its own private obarray when compiling a file, in addition to its own private readtable. -------------------------------------------------------------------- 1) (SUSPEND) may be executed at any point in a computation, and control will be returned to the LISP's superior [DDT or monitor]. Accumulators, push-down stacks, and other variables will be saved, and its starting address will be set so that if the job be dumped on dsk, and reloaded at some future time, starting it again will cause it to resume where the computation and continue just after the call to SUSPEND. One limitation: if any input-output devices are in use other than the TTY, SUSPEND will error with a fail-act. (SUSPEND s), like (MACDMP s), passes the characters of the symbol s to the superior job as a valret string. 2) By "inverse of MAKNUM", the following is meant: (EQ X (MUNKAM (MAKNUM X))) evaluates to T for all X. Shortly, the MULTICS implementation will have a reasonable version of MAKNUM and MUNKAM implemented, so that one may write a hash-coder-on-EQ for s-expressions. Previous notes in LISP ARCHIV have given examples on how to hash an s-expression on EQUAL. By replacing "(\ (SXHASH X) 777))" with "(\ (MAKNUM X) 777)" one will have a hasher on EQ. 3) By "seeding" RANDOM, one may obtain a variety of starting points, corresponding to the various internal states of the two-word state register. Any two successive outputs of RANDOM will do as the two words for a seed; for example, (SETQ X (RANDOM) Y (RANDOM)) will preserve the current state of the random number generator in the variables X and Y, and the state may be restored to that state [after, possibly, further usage of RANDOM] by (RANDOM X Y). Users of RANDOM should take note of a fact which Bill Gosper ferreted out of Knuth - this random number genertor flunks the 3-way serial test. That is, if triplets of "random" numbers are generated by clumping together the 3n, 3n+1, and 3n+2 outputs of RANDOM, then there will be an interdependency among the triples such that half of all triples will be missed - not particularly good for picking "random" points in 3-space. One way out of this bind is simply to use only every other output of RANDOM in generting the triples. 4) As described in previous notes, there is an internal list of "features" describing which of the various MACLISP options are actually available in the LISP being used, and which time-sharing system it is running under. Now the user can create his own feature names and add, or delete, from this list at will. (STATUS FEATURE FOO) is non-NIL if and only if FOO is on the features list; (SSTATUS FEATURE FOO) will add FOO to the features list, and (SSTATUS NOFEATURE FOO) will delete it. (SSTATUS LINMODE T) tells the time-sharing system not to activate your job while waiting for TTY input until a carriage-return is typed. For the TOPS-10 system, it means the basic input instruction is INCHRW instead of INCHR, and that the time-sharing system will handle rubouts until the carriage-return is typed. Since the ITS system does not handle rubouts under any circumstances, many users want a mode under which the rubout handler of the MACLISP reader will be effective on a line-by-line basis, and under which no read reading is done until a carriage-return is typed. This can be achieved as follows: (SSTATUS SYNTAX 13. 501540) ;makes an invisible force-feed char (SSTATUS LINMODE T) ;tells ITS to sleep until or (SSTATUS TTYREAD T) ;tells LISP's reader to forget about looking for ;"balanced" s-expressions before actually gobbling ;up characters from the TTY It is worthwile to note here that the "force-feed" option on , and the TTYREAD option are properties of LISP's readtable, while the LINMODE option is a property of the LISP's relation with the time-sharing system. 5) There has long been a certain ambiguity in LISP with respect to the meaning of an atomic function. For (FOO X Y), most LISP systems will scan the property list of FOO to see if there are any functional properties [such as SUBR, EXPR, etc], and if so, use the first one found as the functional-interpretation of FOO; if none are found, then the value of FOO as a variable is picked up, and the function-hunting process continues recursively. Some other systems always pick up the variable value, and never resort to storing subroutine addresses, or LAMBDA forms, as "properties" on a property list. The function FUNCALL was implemented as a means of directing the MACLISP evaluator first to the variable value as function rather than starting out on the functional properties. Thus, (FUNCALL FOO X Y) is equivalent to (APPLY FOO (LIST X Y)). However, FUNCALL is essentially an interpretation, and the COMPLR can not open-code the dispatch to the function of interest unless more is known about its calling conventions. For this reason, ARRAYCALL, LSUBRCALL, and SUBRCALL have been implemented as FSUBRs. The general forms are (ARRAYCALL type ap i1 . . . in) (LSUBRCALL type lfun arg1 . . . argn) (SUBRCALL type fun arg1 . . . argn) type should be either "FIXNUM", "FLONUM", "T", or "NIL", depending on the resulting type of value returned by the function [or on the array type, in the case of ARRAYCALL. Both T-type and NIL-type arrays may be specified by NIL here, which simply means "s-expression" array rather than "numeric" array.]. ap should evaluate to an array pointer such as created by *ARRAY [(1) returned by *ARRAY if its first argument is NIL, or (2) put on the property list of the given non-NIL symbol]. lfun should evaluate to an LSUBR pointer, which on the PDP10 systems is obtained only by doing (GET 'FOO 'LSUBR) for some LSUBR FOO; similarly, fun should evaluate to a SUBR pointer. The reason the type argument is required is that NCOMPLR can generate optimal code for these applications. Versions of NCOMPLR greater than 454 will code these three functions open [COMPLR will not be nearly so optimal in its codings of these three. Neither will COMPLR actually open-code array references.]. in the case of SUBRCALL and LSUBRCALL, the type info is mainly an aid to NCOMPLR, and type NIL could always be used as default; however, using type FIXNUM or FLONUM where NIL is required will result in wrong code. For ARRAYCALL, it will be necessary always to have the correct type info since wrong code would result from any kind of type mismatch. EXAMPLE: suppose you have done (SETQ BARODD (ARRAY NIL FIXNUM N) BAREVEN (ARRAY NIL FIXNUM N)) Now at this point, both BARODD and BAREVEN hold as value an array pointer. They would have ARRAY properties on their property list if, for example, (ARRAY BARODD FIXNUM N) had been done instead. Then the following will fill BARODD with the first N odd integers, and BAREVEN with the first N even integers: (DO I 1 (1+ I) (> I (* 2 N)) (STORE (ARRAYCALL FIXNUM (COND ((ODDP I) BARODD) (BAREVEN)) (/ (1- I) 2)) I)) 6) EXAMPLE USING MACROS FOR SIMPLIFIED SYNTAX: Assuming BARODD and BAREVEN as above [that is, variables that have been set to some array pointer], let us define two macros (DEFUN MACRO BO (X) (SUBST (CADR X) 'INDEX '(ARRAYCALL FIXNUM BARODD INDEX))) (DEFUN MACRO BE (X) (SUBST (CADR X) 'INDEX '(ARRAYCALL FIXNUM BAREVEN INDEX))) Then we could fill BARODD and BAREVEN as follows: (DO J 1 (1+ J) (> J N) (STORE (BE (1- J)) (* 2 J))) (DO J 0 (1+ J) (NOT (< J N)) (STORE (BO J) (1+ (* 2 J)))) Admittedly, this saves a lot of typing. But suppose you have a host of such array variables that you would like to abbreviate with such a MACRO. Typing in all the macro definitions could be tediously repetitive. Consider the following macro-defining macro, and some of its uses: (DEFUN MACRO ABBA (Y) (SUBLIS (LIST (CONS 'SHORT (CADR Y)) (CONS 'LONG (CADDR Y)) (CONS 'TYPE (CADDR Y))) '(DEFUN MACRO SHORT (X) (SUBST (CDR X) 'INDEXLIST '(ARRAYCALL TYPE LONG . INDEXLIST))))) Now we might use ABBA to produce the macro for BE, but note that the form of the macro is slightly different - the main body of the macro output appears to be a dotted-list rather than a standard list. This is so that arrays of varying numbers of dimensions may have their abbreviations defined by the same super-macro. (ABBA BO BARODD FIXNUM) expands into (DEFUN MACRO BO (X) (SUBST (CDR X) 'INDEXLIST '(ARRAYCALL FIXNUM BARODD . INDEXLIST))) which then causes the appropriate macro definition for BO. As you would expect, then, (BO J) expands into (ARRYACALL FIXNUM BARODD J) But consider the two-dimensional hash array HASH defined as (SETQ HASH (ARRAY NIL T 37 37)) Then (ABBA HA HASH T) defines HA so that (HA 3 (+ N 2)) expands into (ARRAYCALL T HASH 3 (+ N 2)) Guy Steele has accumulated a file of sophisticated macros and macro-defining macros, and the interested may consult with him about them. 7) In order to get maximal speed from open-compiled array references, you may inform NCOMPLR of the actual ranges of the array indices. Thus a two-dimensional array of FIXNUMS, size 3 by 4, could be declared by: (ARRAY* (FIXNUM (CIR 3 4))) Even partial information will be useful; a NIL or ? in index positions will indicate that no information is available about that particular dimension. For example, to add to the above declaration that for a two-dimensional array in which only the column dimension is known in advance, one could say: (ARRAY* (FIXNUM (CORL ? 4) (CIR 3 4))) The previous syntax for ARRAY* is still available, and one should note that the following two forms both convey the same information: (ARRAY* (NOTYPE DXA 1 CIR 2)) (ARRAY* (NOTYPE (DXA NIL) (CIR ? ?))) Also, NCOMPLR now uses its own private obarray when compiling a file, in addition to its own private readtable; they are contained, respectively, in the two global variables COBARRAY and CREADTABLE. If you have the practice of escaping to top-level LISP, and loading in some of your own functions, be sure to do this stuff under the correct obarray and readtable. E.G., you might do ((LAMBDA (OBARRAY READTABLE) (FASLOAD MY FUNS DSK LOSER)) COBARRAY CREADTABLE) TUESDAY APRIL 23,1974 NM+2D.8H.36M.6S. LISP 810 - GLS - BRIEF SYNOPSIS: [1] NEW FUNCTION: GETCHARN [2] ALARMCLOCK AND TTY INTERRUPTS ARE RUN WITH (NOINTERRUPT T) [3] NEW ARRAY SCHEME [4] NEW FUNCTIONS: SUBRCALL, LSUBRCALL, ARRAYCALL [5] UUO'S CHANGED: LER2,LER4 GONE; LER3 MOVED; ACALL,AJCALL NEW [6] HH$X SLIGHTLY IMPROVED ---------------------------------------------------------------- [1] NEW FUNCTION: GETCHARN IS LIKE GETCHAR, BUT RETURNS A NUMBER INSTEAD OF A SINGLE CHARACTER OBJECT. IT IS TO GETCHAR AS EXPLODEN IS TO EXPLODEC, AND IS SIMILAR IN ACTION TO (LAMBDA (X) (CAR (EXPLODEN X))). EXAMPLES: (GETCHARN 'FOOBAR 1) => 106 ;OCTAL (GETCHARN 'FOOBAR 4) => 102 (GETCHARN 'FOOBAR -1) => 0 (GETCHARN 'FOOBAR 77) => 0 [2] WHEN AN ALARMCLOCK OR TTY INTERRUPT HAPPENS, THE NOINTERRUPT FLAG IS SAVED, (NOINTERRUPT T) IS PERFORMED, THE USER'S SERVICE FUNCTION IS EXECUTED, AND THE NOINTERRUPT FLAG IS RESTORED AFTER EXECUTION. [THE FLAG MIGHT CONCEIVABLY BE ON IF (IOC ) WERE USED TO INITIATE THE INTERRUPT - NOINTERRUPT ONLY LOCKS OUT REAL-TIME EVENTS.] THUS, AN ALARMCLOCK HANDLER, FOR EXAMPLE, WONT BE ABORTED BY A RANDOM ^G BEFORE IT HAS HAD A CHANCE TO RESTART THE CLOCK. [3] THE NEW ARRAY SCHEME IS WORKING WELL NOW FROM THE INTERPRETER SIDE; THE NCOMPLR WILL KNOW ABOUT IT WHEN THE NEXT VERSION IS AVAILABLE, AND COMPLR WILL FOLLOW SUIT SHORTLY THEREAFTER. THE LISP NEW-ARRAY SCHEME COMPRISES MANY CHANGES TO THE ARRAY PACKAGE, MOST OF WHICH ARE EXTENSIONS; THERE ARE FEW INCOMPATIBILITIES. THE MOST IMPORTANT EXTENSION IS THE ADDITION OF TWO NEW TYPES OF ARRAYS: FIXNUM AND FLONUM. THESE TYPES OF ARRAYS STORE THEIR ELEMENTS AS 36-BIT WORDS RATHER THAN AS 18-BIT POINTERS, THUS SAVING SPACE AND TIME. SHORTLY, BOTH COMPLR AND NCOMPLR WILL PRODUCE CODE FOR ARRAYS THAT WILL OPEN-ACCESS BOTH STANDARD AND FULLWORD ARRAYS ALMOST AS FAST AS FORTRAN-COMPILED CODE DOES. ONE SOMEWHAT DRASTIC CHANGE: NSTORE WILL GO AWAY, SINCE FIXNUM ARRAYS CAN BE USED WHERE AN ARRAY OF NUMBERS IS DESIRED. FUNCTIONS SUCH AS LOADARRAYS AND DISGORGE WILL BE MODIFIED TO USE FIXNUM ARRAYS RATHER THAN S-EXPRESSION-WITHOUT-GC-PROTECTION ARRAYS. IT IS POSSIBLE THAT SOMETIME IN THE FUTURE THERE MAY BE OTHER VERSIONS OF THE FIXNUM-ARRAY IDEA, IN WHICH THE USER SPECIFIES THE NUMBER OF BITS FOR EACH ENTRY; THUS AN ARRAY OF 1-BIT BYTES COULD EFFECT A SAVINGS OF A FACTOR OF 36. BUT THIS IS ONLY A POSSIBILITY FOR THE FUTURE. OTHER CHANGES AND EXTENSIONS ARE DESCRIBED BELOW ON A FUNCTION-BY-FUNCTION BASIS: (*ARRAY ... ) ;LSUBR (2 . 7) CREATES AN N-DIMENSIONAL ARRAY. SPECIFIES THE TYPE OF THE ARRAY TO BE CREATED: T S-EXPRESSION (AS BEFORE) NIL S-EXPRESSION (BUT NO GC PROTECTION) FIXNUM CONTAINS FIXNUMS AS 36-BIT WORDS FLONUM CONTAINS FLONUMS AS 36-BIT WORDS OBARRAY OBARRAY READTABLE READTABLE IF IS NIL, THEN AN ARRAY OF THE SPECIFIED TYPE, DIMENSIONALITY, AND SIZE IS CREATED, AND A FRESH ARRAY POINTER IS CONSED UP AND RETURNED; THE LATTER IS AN OBJECT WHICH POINTS TO THE BODY OF THE ARRAY. TYPEP OF SUCH AN OBJECT RETURNS "ARRAY". SUCH OBJECTS ARE ALSO THE RESULT OF SAYING (GET 'FOO 'ARRAY), AND ARE THE VALUE OF ATOMIC SYMBOLS LIKE OBARRAY AND READTABLE. ARRAY POINTERS MAY BE GIVEN TO APPLY AND FUNCALL; THUS (READTABLE 10) IS THE 10'TH ENTRY OF THE INITIAL READTABLE, THAT IS, OF THE ARRAY UNDER READTABLE'S ARRAY PROPERTY; BUT (FUNCALL READTABLE 10) IS THE 10'TH ENTRY OF THE CURRENT READTABLE, THAT IS, THE ARRAY POINTER WHICH IS THE VALUE OF THE VARIABLE "READTABLE". IN GENERAL, ARRAY POINTERS MAY BE USED IN ALMOST ANY PLACE (ALMOST!) THAT AN ATOMIC SYMBOL WITH AN ARRAY PROPERTY MAY BE USED. THERE IS A PLACE WHERE ARRAY POINTERS MUST BE USED IN PREFERENCE TO ATOMIC SYMBOLS WITH ARRAY PROPERTIES: SEE THE NEW "ARRAYCALL" FUNCTION BELOW. IN GENERAL, THE USER CANNOT MANIPULATE ARRAYS DIRECTLY, BUT ONLY THROUGH ARRAY POINTERS; THIS IS BECAUSE ARRAYS MAY BE RELOCATED WITHOUT WARNING BY THE GARBAGE COLLECTOR. FURTHERMORE, NO TWO NON-EQ ARRAY POINTERS CAN EVER POINT TO THE SAME ARRAY. IF IS NON-NIL, THEN IT MUST BE EITHER AN ARRAY POINTER OR AN ATOMIC SYMBOL. IF IT IS A SYMBOL, AND THE SYMBOL HAS NO ARRAY PROPERTY, IT IS GIVEN ONE (A FRESH ARRAY POINTER IS CONSED UP FOR THIS PURPOSE). IF IS AN ARRAY POINTER, OR A SYMBOL WITH AN ARRAY PROPERTY, THEN ANY ARRAY CURRENTLY POINTED TO BY THAT POINTER IS KILLED. IN ANY CASE THE ARRAY POINTER IS THEN MADE TO POINT TO THE NEWLY CREATED ARRAY. AN ARRAY MAY BE UP TO FIVE-DIMENSIONAL (FORMERLY ONLY FOUR DIMENSIONS WERE ALLOWED). IF IS SPECIFIED AS JX, THEN THE X'TH SUBSCRIPT VARIES FROM 0 TO JX-1, AS BEFORE. AN ARRAY IS EFFECTIVELY A FUNCTION; THUS IF FOO HAS AN ARRAY PROPERTY, THEN (FOO 1 3) RETURNS ELEMENT [1,3] OF THE ARRAY FOO (WHICH BETTER BE TWO-DIMENSIONAL!) WHEN A NEW ARRAY IS CREATED, ITS ENTRIES ARE INITIALIZED TO NIL FOR ARRAYS OF TYPE "T" OR "NIL", TO 0 FOR FIXNUM ARRAYS, OR TO 0.0 FOR FLONUM ARRAYS. TO INITIALIZE AN ARRAY TO OTHER VALUES, SEE THE FUNCTIONS *REARRAY, BLTARRAY, AND FILLARRAY BELOW. IF IS OBARRAY OR READTABLE, THEN THE EXTRA ARGUMENTS HAVE A SLIGHTLY DIFFERENT SIGNIFICANCE. ONLY TWO OR THREE ARGUMENTS IN ALL MAY BE GIVEN; THE THIRD, IF PRESENT, TELLS HOW TO INITIALIZE THE OBARRAY OR READTABLE. FOR AN OBARRAY, A THIRD ARGUMENT OF NIL MEANS THAT THE NEW OBARRAY SHOULD BE LEFT COMPLETELY EMPTY. A THIRD ARGUMENT OF T MEANS THAT THE NEW ARGUMENT SHOULD BE INITIALIZED FROM THE CURRENT OBARRAY (THAT IS, FROM WHATEVER ARRAY POINTER IS THE CURRENT VALUE OF THE VARIABLE "OBARRAY"). ANY OTHER THIRD ARGUMENT MUST BE AN ARRAY OF TYPE OBARRAY FROM WHICH TO INITIALIZE THE NEW OBARRAY. OMITTING THE THIRD ARGUMENT IS THE SAME AS SAYING T. NOTE THAT WHEN ONE OBARRAY IS INITIALIZED FROM ANOTHER, THE BUCKETS ARE COPIED, BUT THE ATOMIC SYMBOLS ARE NOT COPIED. FOR A READTABLE, A THIRD ARGUMENT OF NIL MEANS THAT THE NEW READTABLE SHOULD BE INITIALIZED FROM THE CURRENT READTABLE. A THIRD ARGUMENT OF T MEANS TO INITIALIZE FROM THE SYSTEM'S INITIAL READTABLE. ANY OTHER THIRD ARGUMENT MUST BE A READTABLE TO INITIALIZE FROM. (IT MAKES NO SENSE TO HAVE AN "EMPTY" READTABLE AS IT DOES FOR AN OBARRAY). OMITTING THE THIRD ARGUMENT IS THE SAME AS SAYING NIL. EXAMPLES: (*ARRAY 'FOO 'FIXNUM 3 4 5) ;FOO GETS AN ARRAY ; PROPERTY FOR A ; 3X4X5 ARRAY OF FIXNUMS (*ARRAY NIL T 4 4) ;RETURNS ARRAY POINTER ; FOR A 4X4 ARRAY OF ; ARBITRARY S-EXPRESSIONS (*ARRAY 'QUUX 'READTABLE) ;QUUX IS GIVEN AN ARRAY ; PROPERTY FOR A ; READTABLE, INITIALIZED ; FROM CURRENT ONE (ARRAY < ... ) ;FSUBR ARRAY IS THE SAME AS *ARRAY, EXCEPT THAT THE FIRST TWO ARGUMENTS ARE NOT EVALUATED. THUS THE EXAMPLES ABOVE COULD HAVE BEEN WRITTEN: (ARRAY FOO FIXNUM 3 4 5) (ARRAY NIL T 4 4) (ARRAY QUUX READTABLE) (STORE ) ;FSUBR THIS WORKS AS BEFORE: IT STORES THE GIVEN VALUE IN THE SPECIFIED ARRAY ELEMENT. IF IS A CALL TO A FIXNUM OR FLONUM ARRAY, THEN SHOULD BE A FIXNUM OR FLONUM, RESPECTIVELY. RECALL THAT STORE EVALUATES ITS SECOND ARGUMENT BEFORE THE FIRST ARGUMENT; THUS (SETQ J 3) (STORE (FOOARRAY (SETQ J 5)) J) WILL STORE 3, NOT 5, IN ELEMENT 5 OF FOOARRAY. ONE SHOULD AVOID DEPENDING ON THIS FACT, HOWEVER, IN THE INTERESTS OF CLARITY. SEE ALSO THE DESCRIPTION OF THE NEW "ARRAYCALL" FUNCTION BELOW. (ARRAYDIMS ) ;SUBR 1 THIS FUNCTION WORKS AS BEFORE, BUT CAN RETURN A BROADER RANGE OF VALUES. IT RETURNS A LIST, SUCH THAT THE CAR OF THE LIST IS THE TYPE OF THE ARRAY (I.E., T, NIL, FIXNUM, FLONUM, OBARRAY, OR READTABLE), AND THE CDR IS A LIST OF ARRAY DIMENSIONS. THUS: (ARRAY QUUX FIXNUM 3 4 5) (ARRAYDIMS 'QUUX) => (FIXNUM 3 4 5) (ARRAYDIMS (GET 'QUUX 'ARRAY)) => (FIXNUM 3 4 5) (ARRAY ZORCH OBARRAY) (ARRAYDIMS 'ZORCH) => (OBARRAY 777) WHERE 777 HAPPENS TO BE THE SIZE OF AN OBARRAY ON THIS GIVEN LISP SYSTEM (THIS VARIES FROM ONE LISP TO ANOTHER). NOTE THAT ARRAYDIMS RETURNS SLIGHTLY DIFFERENT VALUES FOR READTABLES AND OBARRAYS THAN IT USED TO. (*REARRAY ... ) ;LSUBR (1 . 7) THIS FUNCTION WORKS PRETTY MUCH AS BEFORE. IF IT IS GIVEN ONLY ONE ARGUMENT (*REARRAY FOO), THEN FOO MAY BE AN ARRAY POINTER OR AN ATOMIC SYMBOL. IF IT IS AN ATOMIC SYMBOL WITH NO ARRAY PROPERTY, IT MERELY RETURNS. OTHERWISE IT KILLS THE ARRAY POINTED TO BY THE ARRAY POINTER (THE ONE GIVEN, OR THE ONE OBTAINED FROM THE SYMBOL'S PROPERTY LIST). THE ARRAY POINTER IS NOW "DEAD", AND CANNOT BE USED AS A FUNCTION UNLESS AND UNTIL IT IS GIVEN A NEW ARRAY TO POINT TO. IF MORE THAN ONE ARGUMENT IS GIVEN TO *REARRAY, THEN THEY SHOULD BE ARGUMENTS SIMILAR TO THOSE FOR *ARRAY, EXCEPT THAT THE FIRST ARGUMENT MUST ALREADY BE A LIVE ARRAY, EITHER AS AN ARRAY POINTER OR AS A SYMBOL WITH A LIVE ARRAY PROPERTY. *REARRAY EFFECTIVELY CREATES A NEW ARRAY OF THE SPECIFIED DIMENSIONS AND BLTARRAY'S DATA FROM THE GIVEN ARRAY INTO THE NEW, THEN ALTERS THE ARRAY POINTER TO POINT TO THE NEW ARRAY. *REARRAY WILL NOT PERMIT YOU TO ALTER THE TYPE OF THE ARRAY AT PRESENT - YOU MUST SPECIFY THE CORRECT TYPE. IT IS RATHER MEANINGLESS TO USE *REARRAY OF MORE THAN ONE ARGUMENT ON A READTABLE OR OBARRAY. (BLTARRAY ) ;SUBR 2 BLTARRAY, AS BEFORE, COPIES THE DATA IN INTO . IF IS SHORTER, THEN EXTRA DATA IN IS UNHARMED, MORE OR LESS. IF IS SHORTER, THEN AS MUCH DATA AS WILL FIT IS COPIED. BLTARRAY INSISTS ON GETTING TWO ARRAYS OF THE SAME TYPE; IT WILL NOT COPY A FIXNUM ARRAY INTO A FLONUM ARRAY, AN S-EXPRESSION ARRAY, OR A READTABLE. IF ONE OBARRAY IS COPIED INTO ANOTHER, THE BUCKETS ARE COPIED AS WELL, AS IF FOR *ARRAY. (LISTARRAY ) ;SUBR 1 LISTARRAY NOW WORKS ON ARRAYS OF ALL TYPES AND ALL DIMENSIONS. IT RETURNS A LIST OF ALL THE DATA IN THE GIVEN ARRAY. IF A MULTI-DIMENSIONAL ARRAY IS GIVEN, THE DATA IS TAKEN IN ROW-MAJOR ORDER; FOR EXAMPLE: (ARRAY FOO FIXNUM 2 2) (LISTARRAY 'FOO) RETURNS FOO[0,0] FOO[0,1] FOO[1,0] FOO[1,1] AS A LIST IN THAT ORDER. (FILLARRAY ) ;SUBR 2 FILLARRAY IS AN INVERSE TO LISTARRAY, EXCEPT THAT IT IS NOT PERMITTED TO USE FILLARRAY ON READTABLES OR OBARRAYS. IT DISTRIBUTES THE GIVEN LIST OF ITEMS INTO THE GIVEN ARRAY IN ROW-MAJOR ORDER. IF A FIXNUM OR FLONUM ARRAY IS SUPPLIED, THEN THE ELEMENTS OF THE LIST MUST ALL BE FIXNUMS OR FLONUMS, RESPECTIVELY. IF THERE ARE TOO MANY ITEMS IN THE LIST, THE EXTRA ONES ARE IGNORED; IF THERE ARE NOT ENOUGH, THEN THE LAST ONE IS USED TO FILL OUT THE ARRAY. THUS (FILLARRAY 'FOO '(43 11 27)) ;RANDOM NUMBERS FILLS FOO, AS DEFINED ABOVE, SUCH THAT FOO[0,0] = 43 FOO[0,1] = 11 FOO[1,0] = 27 FOO[1,1] = 27 (MAKOBLIST ) ;SUBR 1 THIS FUNCTION WORKS AS BEFORE. NOTE THE FOLLOWING EQUIVALENCES IN THE NEW ARRAY SCHEME: (MAKOBLIST NIL) <=> (LISTARRAY OBARRAY) (MAKOBLIST X) <=> (*ARRAY X 'OBARRAY) FOR X NOT NIL. (MAKREADTABLE ) ;SUBR 1 THIS FUNCTION WORKS AS BEFORE. NOTE THE FOLLOWING EQUIVALENCES IN THE NEW ARRAY SCHEME: (MAKREADTABLE NIL) <=> (*ARRAY (GENSYM) 'READTABLE) (MAKREADTABLE T) <=> (*ARRAY (GENSYM) 'READTABLE T) (MAKREADTABLE X) <=> (*ARRAY X 'READTABLE) FOR X NOT NIL OR T. (ARRAYCALL ... ) ;LSUBR (2 . 6) [SEE ALSO ITEM [4] BELOW.] ARRAYCALL IS SIMILAR TO FUNCALL, BUT INSISTS THAT ITS SECOND ARGUMENT BE AN ARRAY POINTER (AN ATOMIC SYMBOL WITH AN ARRAY PROPERTY IS NOT ACCEPTABLE IN THIS CONTEXT!) ITS FIRST ARGUMENT SHOULD MATCH THE TYPE INFORMATION OF THE ARRAY - EITHER FIXNUM, FLONUM, NIL, OR T. ITS PRIME VIRTUE IS THAT IT PERMITS THE COMPILER TO OPEN-CODE ACCESS TO VARIABLE ARRAYS. ONE MAY ALSO WRITE (STORE (ARRAYCALL TYPE VAR X1 ... XN) VAL) AND HAVE IT COMPILE EFFICIENTLY. EXAMPLE OF USE: (DEFUN TRANSPOSE (A) (PROG (ARY TYP) (COND ((EQ (SETQ TYP (TYPEP A)) 'ARRAY) (SETQ ARY A)) ((AND (EQ TYP 'SYMBOL) (SETQ ARY (GET A 'ARRAY)))) (T (RETURN (TRANSPOSE (ERROR 'NON-ARRAY/ -/ TRANSPOSE A 'WRNG-TYPE-ARG))))) (OR (AND (= (LENGTH (SETQ TYP (ARRAYDIMS ARY))) 3) (= (CADR TYP) (CADDR TYP))) (RETURN (TRANSPOSE (ERROR 'NOT/ 2-DIM/ SQUARE/ -/ TRANSPOSE A 'WRNG-TYPE-ARG)))) (DO ((N) (I 1 (1+ I))) ((= I (CADR TYP))) (DO ((J 1 (1+ J))) ((= J I)) (SETQ N (ARRAYCALL (CAR TYP) ARY I J)) (STORE (ARRAYCALL (CAR TYP) ARY I J) (ARRAYCALL (CAR TYP) ARY J I)) (STORE (ARRAYCALL (CAR TYP) ARY J I) N))) (RETURN A))) ANOTHER VARIATION WOULD BE TO LIMIT TRANSPOSE TO FIXNUM ARRAYS. THE EACH OF THE FOUR USAGES OF ARRAYCALL WOULD BE LIKE (ARRAYCALL 'FIXNUM ARY . . .), AND THE NCOMPLR WOULD BE ABLE TO MAKE OPEN-CODED REFERENCES TO THE ARRAY. PRIN1, PRINC, EXPLODEC, ETC. THE PRINT FUNCTIONS AND OTHER RELATED FUNCTIONS PRINT ARRAY POINTERS IN THE FOLLOWING MANNER: IF THE ARRAY POINTER IS DEAD (POINTS TO NO LIVE ARRAY), IT PRINTS AS "#DEAD-ARRAY". OTHERWISE IT PRINTS AS "#", THE TYPE OF ARRAY, "-", THE DIMENSIONS OF THE ARRAY SEPARATED BY ":" IN THE CURRENT RADIX, "-", AND THE ADDRESS OF THE ARRAY POINTER IN OCTAL. THUS PRINTING AN ARRAY POINTER LETS YOU SEE THE SAME INFORMATION RETURNED BY ARRAYDIMS. EXAMPLES: USER: (ARRAY NIL OBARRAY) LISP: #OBARRAY-777-103426 U: (ARRAY NIL FIXNUM 4 5 6) L: #FIXNUM-4:5:6-103424 U: (ARRAY FOO T 3 5 2 4 3) L: FOO U: (GET 'FOO 'ARRAY) L: #T-3:5:2:4:3-102362 [4] THREE NEW FUNCTIONS: SUBRCALL, LSUBRCALL, ARRAYCALL. (ARRAYCALL IS ALSO THORUGHLY DESCRIBED IN ITEM [3].) THESE ARE ANALOGOUS TO FUNCALL, IN THAT THEY TAKE A "FUNCTION" SPECIFICATION AS THE FIRST ARGUMENT AND AND ARGUMENTS FOR THAT FUNCTION AS THE REST OF THE ARGUMENTS. THE DIFFERENCE IS THAT THE SECOND ARGUMENT TO CALL (FOR AMONG [SUBR, LSUBR, ARRAY]) SHOULD BE THE KIND OF ITEM YOU WOULD OBTAIN BY SAYING (GET 'QUUX ') FOR SOME ATOMIC SYMBOL QUUX. THUS: (SUBRCALL NIL (GET 'CAR 'SUBR) '(A . B)) => A YOU USE THESE AT YOUR OWN RISK, OF COURSE; THE INTERPRETER CAN'T CHECK EVERYTHING. SOON THE COMPILER WILL OPEN-CODE THESE GUYS SUPER-EFFICIENTLY. HERE IS AN INTERESTING HACK: (SETQ SUBRDISPATCH (ARRAY NIL T 40)) ;40=RANDOM SIZE (DO ((I 0 (1+ I)) (X '(CAR CDR CADR REVERSE EXPLODE ...) (CDR X))) ((NULL X)) (STORE (ARRAYCALL T SUBRDISPATCH I) (GET (CAR X) 'SUBR))) (SUBRCALL NIL (ARRAYCALL T SUBRDISPATCH 3) '(A B C)) => (C B A) (SUBRCALL NIL (ARRAYCALL T SUBRDISPATCH 1) '(A B C)) => B AND SO FORTH AND SO ON. THAT IS, YOU CAN HAVE AN ARRAY OF DISPATCH ADDRESSES. AGAIN, BE CAREFUL! [5] FOR MACHINE LANGUAGE HACKERS ONLY: PDP-10 LISP'S UUO'S HAVE BEEN REARRANGED. LER2 AND LER4 HAVE BEEN FLUSHED. LER3'S OPCODE HAS BEEN ALTERED. TWO NEW UUO'S: ACALL AND AJCALL. THE EFFECTIVE ADDRESS OF ACALL MUST AN ARRAY POINTER, WHICH SHOULD HAVE ITS COMPILED-CODE-NEEDS-ME BIT TURNED ON. ACALL SERVES AS AN NCALL TO AN ARRAY (ONE CAN'T INCREMENT THE EFFECTIVE ADDRESS OF AN NCALL TO AN ARRAY BECAUSE IT IS INDIRECT). THE UUO HANDLER THUS SMASHES NCALL'S TO ARRAYS TO BE ACALL'S INSTEAD OF PUSHJ'S, AND SIMILARLY NJCALL'S TO BE AJCALL'S. IN MOST PRACTICAL CASES THIS WILL NOT BE NECESSARY, SINCE THE COMPILER HOPEFULLY CAN OPEN-CODE MOST ARRAY ACCESSES ANYWAY. THE GETMIDASOP FUNCTION HAS BEEN UPDATED TO REFLECT THESE ALTERED OP-CODES. [6] HH$X TRIES NOT TO SIGNAL A ^H INTERRUPT IF IT THINKS THAT THE INTERRUPT WILL BE STACKED IN THE INTERRUPT QUEUE RATHER THAN RUN IMMEDIATELY. IT WILL SIMPLY RETURN TO DDT IN THIS CASE. FRIDAY MARCH 01,1974 FQ+18H.38M.31S. LISP 767 - GLS - [1] NEGATIVE RUNTIMES [2] ERRFRAME CHANGE [3] FUNCALL PUSHES APPLY FRAMES [4] NEW FUNCTION: NRECONC [5] PRINT, PRIN1, PRINC CHECK I/O FLAGS - AFFECTS ABBREVIATION [6] (STATUS UREAD) IS NOW CONSISTENT ABOUT LINKS [7] SOME CHANGES TO ARRAY STUFF (PREPARING FOR NEW ARRAYS) [7A] TYPEP MAY RETURN ARRAY [7B] BIBOP SAR SPACE NOW CALLED ARRAY SPACE [7C] IN BOTH LISPS, ALLOC SAYS "ARRAY=" [8] REVIEW OF P.$X AND FRIENDS ---------------------------------------------------------------- [1] IT HAS BEEN OBSERVED THAT OCCASIONALLY RUNTIMES WILL BE MEASURED AS BEING NEGATIVE. THIS IS APPARENTLY AN ITS BUG HAVING SOMETHING TO DO WITH REQUESTING CORE MANAGEMENT, SO IT HAPPENS MORE IN BIBOP LISP THAN IN NON-BIBOP. I'VE TAKEN SOME COMPENSATIVE ACTIONS, BUT BE FOREWARNED AND BEWARE. [2] CHANGE TO ERRFRAMES: FOR COMPATIBILITY WITH EVALFRAMES, ERRFRAMES ARE NOW OF THE FORM (ERR ) I.E. THE ATOM "ERR" IS NOW CONSED ON THE FRONT, JUST AS "EVAL" OR "APPLY" IS CONSED ONTO AN EVALFRAME. [3] SPEAKING OF EVALFRAMES: FUNCALL CREATES SUCH A FRAME OF THE APPLY VARIETY THESE DAYS. [4] (NRECONC X Y) <=> (NCONC (NREVERSE X) Y) BUT IS FASTER, BECAUSE IT DOESN'T HAVE TO SCAN BACK DOWN THE LIST JUST NREVERSED TO DO THE NCONC. [5] PRINT, PRIN1, AND PRINC CHECK ALL THEOUTPUT FLAGS (^W, ^R, ^B, ^N) BEFORE COMMENCING PRINTOUT. IF THE FLAGS ALL INDICATE NO OUTPUT, THEY RETURN IMMEDIATELY, THUS SAVING MUCH TIME. FURTHERMORE, IF OUTPUT IS GOING TO THE TTY AND NOWHERE ELSE, AND YOU ARE USING PRINLEVEL AND PRINLENGTH TO GET ABBREVIATED FORMS OUTPUT, THEN ONLY THE ABBREVIATED FORMS ARE GENERATED. THIS MEANS THAT TYPING ^R IN THE MIDDLE OF SUCH A PRINTOUT MAY CAUSE A FILE TO RECEIVE (THE TAIL END OF) AN ABBREVIATED FORM, EVEN IF (STATUS ABBREVIATE) REQUESTS OTHERWISE. ON THE OTHER HAND, THIS HACK PREVENTS CERTAIN SCREWS INVOLVING CIRCULAR LISTS. [6] IF DSK:LOSER;FOO BAR IS A LINK TO DSK:CLOD;ZORCH QUUX AND YOU DO (UREAD FOO BAR DSK LOSER), THEN (STATUS UREAD) WILL RETURN (ZORCH QUUX DSK CLOD) AND NOT (ZORCH QUUX DSK LOSER) AS IT USED TO. [7] SOME NEW STUFF HAS BEEN INSTALLED IN THIS LISP IN ANTICIPATION OF THE NEW FAST ARRAY SCHEME. A NEW KIND OF SPACE HAS BEEN IMPLEMENTED IN NON-BIBOP LISP, ANALOGOUS TO BIBOP LISP'S FORMER "SAR" SPACE, WHICH HOLDS OBJECTS CALLED ARRAY POINTERS. [7A] SUCH OBJECTS ARE OF TYPE "ARRAY". TYPEP WILL RETURN "ARRAY" FOR SUCH AN OBJECT. [7B] BIBOP'S SAR SPACE IS NOW CALLED ARRAY SPACE, FOR INDEED THEY ARE THE SAME OBJECTS. THUS YOU MUST NOW SAY (ALLOC '(ARRAY 300)) INSTEAD OF (ALLOC '(SAR 300)), ETC. [7C] THE INITIAL ALLOC WILL ASK YOU "ARRAY=". ARRAY POINTERS ARE TWO WORDS, SO IF YOU SAY 100., YOU HAVE ALLOCATED ROOM FOR 50. ARRAY POINTERS. OTHERWISE ALL THE ARRAY STUFF SHOULD WORK THE SAME AS BEFORE; BUT WATCH FOR THE NEW ARRAY SCHEME! [8] FOR PEOPLE WHO USE DDT TO DEBUG LISP CODE (I.E. SUPER-HACKERS), HERE IS A REVIEW OF P.$X AND FRIENDS: P.$X AND RELATED GOODIES ARE NAMED INSTRUCTIONS WHICH YOU CAN EXECUTE FROM DDT WITH THE $X COMMAND WHICH DO ALL KINDS OF NICE THINGS FOR YOU. THEY AVOID CLOBBERING ANYTHING WITHIN THE LISP, E.G. THEY SAVE AND RESTORE ANY ACCUMULATORS AND/OR TEMPORARIES THEY USE, AND ARE CIRCUMSPECT ABOUT I/O SWITCHES. REFERENCES TO "THE LEFT HALF OF ." OR "THE RIGHT HALF OF ." MEANS THAT THE LEFT OR RIGHT HALF OF DDT'S CURRENTLY OPEN LOCATION IS UNDER CONSIDERATION. $=ALTMODE. P.$X ASSUMES THE RIGHT HALF OF . TO BE AN S-EXPRESION, AND PRINTS IT. PL.$X PRINTS THE LEFT HALF OF . AS AN S-EXPRESSION. PP Z$X WHERE Z IS SOME QUANTITY, PRINTS THAT QUANTITY AS IF IT WERE A POINTER, AS AN S-EXPRESSION. (PP IS A UUO, AND Z IS ITS EFFECTIVE ADDRESS. SINCE PP IS A UUO, A FEW TEMPORARIES USED BY THE UUO HANDLER GET CLOBBERED; THUS BEWARE OF USING IT IF YOU MAY HAVE BROKEN OUT OF THE UUO HANDLER TO DDT.) VC.$X ASSUMES THAT THE RIGHT HALF OF . POINTS TO A VALUE CELL, AND RUNS OVER THE OBARRAY TRYING TO FIND AN ATOM WITH THAT VALUE CELL. PRINTS THE ATOM IF IT FINDS ONE, OTHERWISE PRINTS ?. VCL.$X ASSUMES LEFT HALF OF . POINTS TO A VALUE CELL, AND BEHAVES LIKE VC.$X. NOTE THAT THIS IS PARTICULARLY GOOD FOR EXAMINING SPECIAL PDL ENTRIES, WHICH HAVE VALUE CELL POINTERS IN THE LEFT HALF, AND OLD VALUES ON THE RIGHT HALF. SB.$X ASSUMES THAT THE RIGHT HALF OF . POINTS SOMEWHERE INTO THE MIDDLE OF A SUBR, AND RUNS OVER THE OBARRAY TRYING TO FIND THE NAME OF THE SUBR. IF THE NAME CAN BE FOUND, IT IS PRINTED. THIS IS ESPECIALLY GOOD FOR REGULAR PDL ENTRIES CREATED BY PUSHJ, BECAUSE THEY CONTAIN A SUBR RETURN ADDRESS IN THE RIGHT HALF. HH$X CREATE A FAKE ^H BREAKPOINT IN LISP. THIS SAVES THE ENVIRONMENT THE WAY ANY USER INTERRUPT DOES AND LETS YOU INVESTIGATE A LITTLE. THIS IS GOOD WHEN YOU CAN'T AFFORD TO PROCEED THE LISP EVEN LONG ENOUGH TO TYPE ^H AT IT. WHEN YOU TYPE $P AT LISP, YOU WILL SEE A *. YOU ARE IN DDT! (YES, $P GETS YOU BACK TO DDT, NOT BACK FROM IT, HERE!) NOTE THAT IF YOU WENT BACK TO DDT WHILE LISP HAD USER INTERRUPTS LOCKED OUT (E.G. IN THE MIDDLE OF A GARBAGE COLLECTION), THEN THE ^H BREAK CAN'T BE RUN; YOU WILL RETURN TO DDT IMMEDIATELY. DP$X DEPURIFIES THE PAGE CONTAINING .. THIS WAS INVENTED BEFORE DDT DID IT FOR YOU. RP$X REPURIFIES THE PAGE CONTAINING .. THIS IS SOMEWHAT MORE USEFUL, E.G. TO REPURIFY A PAGE AFTER PATCHING IT. PURIFY$G THIS PURIFIES THE SYSTEM PAGES OF LISP WHICH MAY BE PURE. FOR BIBOP LISP, IT ALSO PURIFIES THOSE PAGES OF USER CODE WHICH HAVE BEEN MARKED AS PURIFIABLE. IT TENDS TO DESTROY ACCUMULATORS; YOU CAN'T PROCEED AFTER DOING IT. (IT IS GENERALLY PERFORMED PRIOR TO DUMPING OUT A LISP, E.G. JUST AFTER A CALL TO THE FUNCTION MACDMP.) THE REST OF THESE ARE AVAILABLE ONLY IN BIBOP LISP. T.$X IS LIKE P.$X, BUT INSTEAD OF PRINTING THE RIGHT HALF OF . AS AN S-EXPRESSION, IT GETS TYPEP INFORMATION FOR IT FROM THE BIBOP TYPE TABLE, AND PRINTS THE TYPE INFORMATION. TL.$X LIKE T.$X, BUT LOOKS AT THE LEFT HALF OF .. TP Z$X LIKE PP Z$X, ONLY DOES T. INSTEAD OF P.. TBLPUR$X PRINTS OUT BIBOP'S PURTBL DATA BASE, ONE DIGIT FOR EVERY PAGE IN THE 256K ADDRESS SPACE. THE DIGITS ARE 0 = NONEXISTENT MEMORY, 1 = IMPURE MEMORY, 2 = PURE MEMORY, 3 = MEMORY IN AN UNCERTAIN STATE, E.G. PDL AREAS AND THE END OF BINARY PROGRAM SPACE. AT THE END SUMMARIES ARE PRINTED. THIS IS NOT THE ACTUAL STATE OF MEMORY, BUT ONLY WHAT BIBOP WOULD LIKE IT TO BE, E.G. A PAGE MARKED 2 MAY NOT REALLY BE PURE. PURIFY$X IN BIBOP EFFECTIVELY FORCES THE ACTUAL STATE OF THE WORLD TO CONFORM TO THE PURTBL. PAGPUR$X PRINTS OUT A TABLE LIKE TBLPUR, BUT DISPLAYS THE ACTUAL STATE OF EACH PAGE, NONEXISTENT, IMPURE, OR PURE.