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.  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.  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.  There is no longer any NOARGS feature, nor ARGSP functional; if you don't know what this means, don't worry about it.  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  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.  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.  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.  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. ____________________________________________________________________________  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 >])  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.  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.