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.