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 <name> 
    					  <version-number> 
    				  <original-form> 
    					  <expansion>)
    			   Thereafter, the macro named MACROEXPANDED will 
    			   return the <expansion> until either the value of
    			   MACRO-EXPANSION-USE changes, or the <version-number>
    			   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.