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.