(FILECREATED "12-JUN-83 01:26:40" {PHYLUM}<LISPCORE>SOURCES>MACROAUX.;4 20180  

      changes to:  (VARS MACROAUXCOMS)

      previous date: " 3-JUN-83 23:11:33" {PHYLUM}<LISPCORE>SOURCES>MACROAUX.;3)


(* Copyright (c) 1983 by Xerox Corporation)

(PRETTYCOMPRINT MACROAUXCOMS)

(RPAQQ MACROAUXCOMS ((EXPORT (DECLARE: DONTCOPY (MACROS NNLITATOM \NULL.OR.FIXP \CHECKTYPE 
							CANONICAL.TIMERUNITS))
			     (COMS (* Macros which do, respectively, macro-expansion and evaluation 
				      of their "argument")
				   (DECLARE: DONTCOPY (FNS \MACRO...ppmacro)
					     (MACROS \MACRO.MX \MACRO.EVAL)
					     (ADDVARS (PRETTYPRINTMACROS (\MACRO.MX . 
									   \MACRO...ppmacro)
									 (\MACRO.EVAL . 
									   \MACRO...ppmacro))))))
		     (COMS (* functions which help macro and compiler writers.)
			   (FNS ARGS.COMMUTABLEP.LIST EVALUABLE.CONSTANT.FIXP LISPFORM.SIMPLIFY 
				NO.SIDEEFFECTS.FNP CARCDR.FNP CODE.SUBST CODE.SUBPAIR)
			   (GLOBALRESOURCES \NSE.STRPTR)
			   (FNS ARGS.COMMUTABLEP ARGS.COMMUTABLEP.LIST VAR.NOT.USED \VARNOTUSED 
				\VARNOTUSED.LIST EVALUABLE.CONSTANTP EVALUABLE.CONSTANT.FIXP)
			   (MACROS EVALUABLE.CONSTANT.FIXP)
			   (FNS \WALKOVER.SPECIALFORMS \WALKOVER.SF.LIST \WALKOVER.FUNCTION)
			   (DECLARE: DONTCOPY (CONSTANTS \QUOTIFYING.NLS \WALKABLE.SPECIALFORMS)
				     (MACROS \WALKABLE.SPECIALFORMP))
			   (ADDVARS (CONSTANTFOLDFNS IMIN IMAX IABS LOGOR LOGXOR LOGAND))
			   (UGLYVARS NO.SIDEEFFECTS.HARRAY)
			   (PROP GLOBALVAR NO.SIDEEFFECTS.HARRAY)
			   (GLOBALVARS CLISPARRAY CONSTANTFOLDFNS))))
(* FOLLOWING DEFINITIONS EXPORTED)


(DECLARE: DONTCOPY 
(DECLARE: EVAL@COMPILE 

(PUTPROPS NNLITATOM MACRO (OPENLAMBDA (X)
  (AND X (LITATOM X))))

(PUTPROPS NNLITATOM DMACRO (OPENLAMBDA (X)
  (AND X (LITATOM X))))

(PUTPROPS \NULL.OR.FIXP MACRO (OPENLAMBDA (X)
  (OR (NULL X)
      (FIXP X))))

(PUTPROPS \CHECKTYPE MACRO (X
  (PROG ((VAR (CAR X))
	 (PRED (CADR X)))
        (if (AND (LISTP PRED)
		 (MEMB (CAR PRED)
		       (QUOTE (QUOTE FUNCTION))))
	    then (SETQ PRED (LIST (CADR PRED)
				  VAR)))
        (RETURN (SUBPAIR (QUOTE (MSG VAR PRED))
			 (LIST (CONCAT "
 is not a suitable value for the variable:  " VAR)
			       VAR PRED)
			 (QUOTE (until PRED do (SETQ VAR (ERROR VAR MSG)))))))))

(PUTPROPS CANONICAL.TIMERUNITS MACRO (OPENLAMBDA (X)
                                                             (* Checks for common abbreviations before calling 
							     \CanonicalizeTimerUnits)
  (SELECTQ X
	   ((TICKS MILLISECONDS SECONDS)                     (* These are the canonical forms)
	     X)
	   ((TICS)
	     (QUOTE TICKS))
	   ((NIL MS MILLISECS)
	     (QUOTE MILLISECONDS))
	   ((SECS)
	     (QUOTE SECONDS))
	   (\CanonicalizeTimerUnits X))))
)
)



(* Macros which do, respectively, macro-expansion and evaluation of their "argument")

(DECLARE: DONTCOPY 
(DEFINEQ

(\MACRO...ppmacro
  (LAMBDA (L)                                                (* JonL "19-NOV-82 21:46")
    (PROG ((POS (POSITION))
	   (LNL (LINELENGTH)))
          (printout NIL (QUOTE %()
		    .FONT CLISPFONT (CAR L)
		    .FONT SYSTEMFONT (PROGN (if (NOT (FITP (CADR L)
							   LNL))
						then (TAB (IPLUS POS 1)))
					    (QUOTE % ))
		    .PPFTL
		    (CDR L)
		    (QUOTE %))))))
)

(DECLARE: EVAL@COMPILE 

(PUTPROPS \MACRO.MX MACRO (Z
  (PROG ((X (EXPANDMACRO (CAR Z)
			 T)))
        (COND
	  ((EQ X (CAR Z))
	    (ERROR "No macro property -- \MACRO.MX" X))
	  (T (RETURN X))))))

(PUTPROPS \MACRO.EVAL MACRO (Z
  (PROG ((X (EXPANDMACRO (CAR Z)
			 T)))
        (if (EQ X (CAR Z))
	    then (ERROR "No macro property -- \MACRO.EVAL" X)
	  else (RETURN (EVAL X))))))
)


(ADDTOVAR PRETTYPRINTMACROS (\MACRO.MX . \MACRO...ppmacro)
			    (\MACRO.EVAL . \MACRO...ppmacro))
)


(* END EXPORTED DEFINITIONS)




(* functions which help macro and compiler writers.)

(DEFINEQ

(ARGS.COMMUTABLEP.LIST
  (LAMBDA (L Y)                                              (* JonL "21-NOV-82 15:07")
    (EVERY L (FUNCTION (LAMBDA (X)
	       (ARGS.COMMUTABLEP X Y))))))

(EVALUABLE.CONSTANT.FIXP
  (LAMBDA (X)                                                (* JonL "25-FEB-83 20:36")
    (FIXP (CAR (EVALUABLE.CONSTANTP X)))))

(LISPFORM.SIMPLIFY
  (LAMBDA (X QUIETFLG DWIMIFYFLGORLST)                       (* JonL "14-JAN-83 18:51")
                                                             (* Reduce some LISP code to its more primitive form.
							     Currently, supporst macroexpansion, dwimmification, and 
							     evaluation of compile-time constants.)
    (OR (LISTP DWIMIFYFLGORLST)
	(SETQ DWIMIFYFLGORLST (NEQ DWIMIFYFLGORLST (QUOTE DONT))))
    (PROG (Y (CLISPIFTRANFLG T))
          (DECLARE (SPECVARS CLISPIFTRANFLG))
      A   (if (AND (LISTP X)
		   (LITATOM (SETQ Y (CAR X)))
		   (SETQ Y (GETMACROPROP Y COMPILERMACROPROPS))
		   (NEQ X (SETQ X (MACROEXPANSION X Y))))
	      then                                           (* Causes form to be macroexpanded until it is no longer
							     a macro call)
		   (GO A))
          (if (SETQ Y (CONSTANTEXPRESSIONP X))
	      then (SETQ X (KWOTE (CAR Y)))
	    elseif (AND (LISTP X)
			DWIMIFYFLGORLST
			(OR (SETQ Y (GETHASH X CLISPARRAY))
			    (PROG2 (DWIMIFY X T (LISTP DWIMIFYFLGORLST))
				   (SETQ Y (GETHASH X CLISPARRAY))
                                                             (* Keep the CLISP hasharry clean)
				   (PUTHASH X NIL CLISPARRAY))))
	      then (SETQ X Y)
		   (GO A))
          (if (NOT QUIETFLG)
	      then (PRINTDEF X NIL T)
		   (TERPRI)
	    else (RETURN X)))))

(NO.SIDEEFFECTS.FNP
  (LAMBDA (X)                                                (* JonL "26-FEB-83 17:07")
    (AND (NNLITATOM X)
	 ((LAMBDA (N C1)
	     (OR (AND (ILEQ N 6)
		      (EQ C1 (CHARCODE C))
		      (EQ (NTHCHARCODE X N)
			  (CHARCODE R))
		      (CARCDR.FNP X))
		 (AND (IGEQ N 8)
		      (EQ C1 (CHARCODE \))
		      (EQ (NTHCHARCODE X 8)
			  (CHARCODE E))
		      (GLOBALRESOURCE (\NSE.STRPTR)
				      (EQUAL "\GETBASE" (SUBSTRING X 1 8 \NSE.STRPTR))))
		 (GETHASH X NO.SIDEEFFECTS.HARRAY)))
	   (NCHARS X)
	   (CHCON1 X)))))

(CARCDR.FNP
  [LAMBDA (X)                      (* lmm " 3-JUN-83 23:05")
                                   (* All versions of compiler have the CROPS property set for CAR/CDR fns)
    (GETPROP X (QUOTE CROPS])

(CODE.SUBST
  (LAMBDA (X Y FORM)                                         (* JonL "21-NOV-82 14:24")
                                                             (* Ho Hum, someday this ought to be made to work!)
    (SUBST X Y FORM)))

(CODE.SUBPAIR
  (LAMBDA (L1 L2 FORM)                                       (* JonL "21-NOV-82 14:24")
                                                             (* Ho Hum, someday this ought to be made to work!)
    (SUBPAIR L1 L2 FORM)))
)

(RPAQQ \NSE.STRPTR NIL)
(DECLARE: DOEVAL@COMPILE DONTCOPY

(ADDTOVAR GLOBALVARS \NSE.STRPTR)
)
(DECLARE: DOEVAL@COMPILE DONTCOPY 
(PUTDEF (QUOTE \NSE.STRPTR)
	(QUOTE GLOBALRESOURCES)
	(QUOTE (ALLOCSTRING 0)))
)
(DEFINEQ

(ARGS.COMMUTABLEP
  (LAMBDA (X Y)                                              (* JonL "25-FEB-83 20:53")
                                                             (* non-NIL iff the evaluation of X and Y can be done in 
							     either order without any change in effects or value.)
    (PROG (FN)
          (if (NLISTP Y)
	      then (if (NLISTP X)
		       then                                  (* If both args are atoms, then we can just punt out 
							     here with the answer.)
			    (RETURN T))                      (* Switch args so that we don't have to handle the case 
							     of Y an atom)
		   (SETQ X (PROG1 Y (SETQ Y X))))
          (if (if (LISTP X)
		  then                                       (* Fast check for quoted frobs.
							     Remember, Y can't be an atom.)
		       (MEMB (CAR X)
			     \QUOTIFYING.NLS)
		else                                         (* Cases like random, non-variable atoms)
		     (NOT (NNLITATOM X)))
	      then (RETURN T))
          (SETQ Y (LISPFORM.SIMPLIFY Y T))
          (RETURN (if (LISTP (SETQ FN (CAR Y)))
		      then (if (EQ (CAR FN)
				   (QUOTE LAMBDA))
			       then (ARGS.COMMUTABLEP.LIST Y (LISPFORM.SIMPLIFY X T)))
		    elseif (MEMB FN \QUOTIFYING.NLS)
		      then (QUOTE T)
		    elseif (EQ FN (QUOTE SETQ))
		      then (AND (\VARNOTUSED X (CADR Y))
				(ARGS.COMMUTABLEP.LIST (CDDR Y)
						       (LISPFORM.SIMPLIFY X T)))
		    elseif (\WALKABLE.SPECIALFORMP FN)
		      then (\WALKOVER.SPECIALFORMS (FUNCTION ARGS.COMMUTABLEP)
						   Y
						   (LISPFORM.SIMPLIFY X T))
		    else (AND (NO.SIDEEFFECTS.FNP FN)
			      (ARGS.COMMUTABLEP.LIST (CDR Y)
						     (LISPFORM.SIMPLIFY X T))))))))

(ARGS.COMMUTABLEP.LIST
  (LAMBDA (L Y)                                              (* JonL "21-NOV-82 15:07")
    (EVERY L (FUNCTION (LAMBDA (X)
	       (ARGS.COMMUTABLEP X Y))))))

(VAR.NOT.USED
  (LAMBDA (FORM VAR SETQONLY?)                               (* JonL "21-NOV-82 14:01")
    (PROG NIL
      A   (if (NOT (LITATOM VAR))
	      then (SETERRORN 14 VAR)
		   (SETQ VAR (ERRORX))
		   (GO A))
          (if (MEMB VAR (QUOTE (NIL T)))
	      then (SETERRORN 27 VAR)
		   (SETQ VAR (ERRORX))
		   (GO A))
          (RETURN (\VARNOTUSED FORM VAR SETQONLY?)))))

(\VARNOTUSED
  (LAMBDA (FORM VAR SETQONLY?)                               (* JonL "21-NOV-82 16:10")
                                                             (* Look for free occurances of a variable VAR which may 
							     be evaluable in FORM)
    (if (NLISTP FORM)
	then (AND (NOT SETQONLY?)
		  (NEQ VAR FORM))
      elseif (LISTP (CAR FORM))
	then (\VARNOTUSED.LIST FORM VAR SETQONLY?)
      elseif (EQ (CAR FORM)
		 (QUOTE LAMBDA))
	then                                                 (* Note that if a LAMBDA form bind a var X, then VAR 
							     can't be "used inside" the form.)
	     (OR (MEMB VAR (CADR FORM))
		 (\VARNOTUSED (CDDR FORM)
			      VAR SETQONLY?))
      elseif (MEMB (CAR FORM)
		   \QUOTIFYING.NLS)
	then T
      elseif (MEMB (CAR FORM)
		   (QUOTE (SETQ)))
	then                                                 (* Stupid Interlisp SETQ format -- You really wound't 
							     believe it!)
	     (AND (NEQ VAR (CADR FORM))
		  (\VARNOTUSED.LIST FORM VAR SETQONLY?))
      elseif (\WALKABLE.SPECIALFORMP (CAR FORM))
	then (\WALKOVER.SPECIALFORMS (FUNCTION \VARNOTUSED)
				     FORM VAR SETQONLY?)
      elseif (NO.SIDEEFFECTS.FNP (CAR FORM))
	then (\VARNOTUSED.LIST (CDR FORM)
			       VAR SETQONLY?))))

(\VARNOTUSED.LIST
  (LAMBDA (L X SETQONLY?)                                    (* JonL "21-NOV-82 15:06")
    (EVERY L (FUNCTION (LAMBDA (FORM)
	       (\VARNOTUSED FORM X SETQONLY?))))))

(EVALUABLE.CONSTANTP
  (LAMBDA (X)                                                (* JonL "26-FEB-83 13:44")
    (if (OR (NLISTP X)
	    (EQ (CAR X)
		(QUOTE QUOTE))
	    (EQ (CAR X)
		(QUOTE CONSTANT))
	    (FMEMB (CAR X)
		   CONSTANTFOLDFNS))
	then                                                 (* Unfortunately, CONSTANT has a macro property which 
							     may conflict with the action of LISPFORM.SIMPLIFY)
	     (CONSTANTEXPRESSIONP X)
      else (if (LISTP X)
	       then (SETQ X (LISPFORM.SIMPLIFY X T)))
	   (if (NLISTP X)
	       then (CONSTANTEXPRESSIONP X)
	     elseif (NNLITATOM (CAR X))
	       then (if (\WALKABLE.SPECIALFORMP (CAR X))
			then (if (\WALKOVER.SPECIALFORMS (FUNCTION EVALUABLE.CONSTANTP)
							 X)
				 then 

          (* This branch currently has a bug in it -- we'd like a version of EVAL which didn't just do an EVALV on litatoms,
	  but first check CONSTANTEXPRESSIONP on them. The problem occurs in cross-compilation.)


				      (LIST (EVAL X)))
		      elseif (AND (NOT (FMEMB (CAR X)
					      (QUOTE (CONS LIST CREATECELL \ALLOCKBLOCK ARRAY 
							   MKSTRING MKATOM ALLOCSTRING SYSTEMTYPE 
							   MACHINETYPE GETD))))
				  (NO.SIDEEFFECTS.FNP (CAR X)))
			then                                 (* If a random function without side-effects, then it is
							     constant when applied to constant args, except for 
							     consers of various kinds.)
			     (PROG ((VALS (for Z in (CDR X) collect (CAR (OR (EVALUABLE.CONSTANTP
									       Z)
									     (RETURN))))))
			           (RETURN (if VALS
					       then (LIST (APPLY (CAR X)
								 VALS))))))
	     elseif (AND (LISTP (CAR X))
			 (EQ (CAAR X)
			     (QUOTE LAMBDA)))
	       then (if (NLISTP (CADAR X))
			then                                 (* Arglist is NIL or some non-list.)
			     (EVALUABLE.CONSTANTP (CONS (QUOTE PROGN)
							(APPEND (CDR X)
								(CDDAR X))))
		      else (for Z VALS in (CDR X)
			      do                             (* Be sure that any "arguments" are all constant.
							     Then do "beta" reduction.)
				 (push VALS (KWOTE (CAR (OR (EVALUABLE.CONSTANTP Z)
							    (RETURN)))))
			      finally (RETURN (EVALUABLE.CONSTANTP (CODE.SUBPAIR (CADAR X)
										 VALS
										 (CONS (QUOTE PROGN)
										       (CDDAR X)))))))
	       ))))

(EVALUABLE.CONSTANT.FIXP
  (LAMBDA (X)                                                (* JonL "25-FEB-83 20:36")
    (FIXP (CAR (EVALUABLE.CONSTANTP X)))))
)
(DECLARE: EVAL@COMPILE 

(PUTPROPS EVALUABLE.CONSTANT.FIXP MACRO ((X)
  (FIXP (CAR (EVALUABLE.CONSTANTP X)))))
)
(DEFINEQ

(\WALKOVER.SPECIALFORMS
  (LAMBDA (PRED FORM REST1 REST2 REST3)                      (* JonL "29-JAN-83 21:30")
                                                             (* Loser! What I really need is a &REST argument L, and 
							     use (APPLY PRED <specific-item> L) instead of the 
							     APPLY*)
    (SELECTQ (CAR (LISTP FORM))
	     (COND (EVERY (CDR FORM)
			  (FUNCTION (LAMBDA (CLZ)
			      (OR (NLISTP CLZ)
				  (\WALKOVER.SF.LIST PRED CLZ REST1 REST2 REST3))))))
	     ((SELECTQ SELECTC)
	       (AND (APPLY* PRED (CADR FORM)
			    REST1 REST2 REST3)
		    (APPLY* PRED (CAR (LAST FORM))
			    REST1 REST2 REST3)
		    (for LL on (CDDR FORM) until (NULL (CDR LL)) do (OR (\WALKOVER.SF.LIST
									  PRED
									  (CDAR LL)
									  REST1 REST2 REST3)
									(RETURN))
		       finally (RETURN T))))
	     ((AND OR FRPTQ SETQ)
	       (\WALKOVER.SF.LIST PRED (CDR FORM)
				  REST1 REST2 REST3))
	     ((APPLY APPLY*)
	       (AND (\WALKOVER.FUNCTION PRED (CADR FORM)
					REST1 REST2 REST3)
		    (\WALKOVER.SF.LIST PRED (CDDR FORM)
				       REST1 REST2 REST3)))
	     ((MAP MAPLIST MAPC MAPCAR MAPCON MAPCONC MAPHASH EVERY SOME NOTEVERY NOTANY)
	       (AND (APPLY* PRED (CADR FORM)
			    REST1 REST2 REST3)
		    (CAR (SETQ FORM (CDDR FORM)))
		    (\WALKOVER.FUNCTION PRED (CAR FORM)
					REST1 REST2 REST3)
		    (OR (NLISTP (CDR FORM))
			(\WALKOVER.FUNCTION PRED (CADR FORM)
					    REST1 REST2 REST3))))
	     ((MAPATOMS)
	       (\WALKOVER.FUNCTION PRED (CADR FORM)
				   REST1 REST2 REST3))
	     ((PROG)                                         (* FooBar! Note that we can't currently walk over a PROG
							     -- 30 JAN 1983)
	       (AND (EVERY (CADR FORM)
			   (FUNCTION (LAMBDA (L)
			       (OR (NLISTP L)
				   (NLISTP (CDR L))
				   (APPLY* PRED (CADR L)
					   REST1 REST2 REST3)))))
		    (EVERY (CDDR FORM)
			   (FUNCTION (LAMBDA (L)
			       (OR (NLISTP L)
				   (APPLY* PRED L REST1 REST2 REST3)))))))
	     (SHOULDNT))))

(\WALKOVER.SF.LIST
  (LAMBDA (PRED L REST1 REST2 REST3)                         (* JonL "21-NOV-82 15:04")
    (EVERY L (FUNCTION (LAMBDA (X)
	       (APPLY* PRED X REST1 REST2 REST3))))))

(\WALKOVER.FUNCTION
  (LAMBDA (PRED FN REST1 REST2 REST3)                        (* JonL "21-NOV-82 15:11")
                                                             (* Analyze case where FN is being applied 
							     (e.g. as in MAPCAR))
    (if (OR (NLISTP FN)
	    (NOT (MEMB (CAR FN)
		       (QUOTE (QUOTE FUNCTION)))))
	then (AND (APPLY* PRED FN REST1 REST2 REST3)
		  (APPLY* PRED (QUOTE (\TypicalUnknownFunction))
			  REST1 REST2 REST3))
      else (APPLY* PRED (if (NLISTP (SETQ FN (CADR FN)))
			    then (LIST FN)
			  else FN)
		   REST1 REST2 REST3))))
)
(DECLARE: DONTCOPY 
(DECLARE: EVAL@COMPILE 

(RPAQQ \QUOTIFYING.NLS (QUOTE FUNCTION DECLARE CONSTANT DEFERREDCONSTANT))

(RPAQQ \WALKABLE.SPECIALFORMS (COND SELECTQ SELECTC AND OR SETQ FRPTQ APPLY APPLY* MAP MAPLIST MAPC 
				    MAPCAR MAPCON MAPCONC MAPHASH MAPATOMS EVERY SOME NOTEVERY NOTANY)
)

(CONSTANTS \QUOTIFYING.NLS \WALKABLE.SPECIALFORMS)
)

(DECLARE: EVAL@COMPILE 

(PUTPROPS \WALKABLE.SPECIALFORMP MACRO ((FORM)
  (MEMB FORM \WALKABLE.SPECIALFORMS)))
)
)

(ADDTOVAR CONSTANTFOLDFNS IMIN IMAX IABS LOGOR LOGXOR LOGAND)
(READVARS NO.SIDEEFFECTS.HARRAY)
 ( ( {H2047 244 T COPYTERMTABLE T FFETCHFIELD T EXPANDMACRO T NEQ T SUBPAIR T \GETBITS T 
COMPILEDFETCHFIELD T FRAMESCAN T VALUEOF T GETDEF T NEGATE T READTABLEP T CONSCOUNT T BOXCOUNT T 
FETCHFIELD T COPY T TYPENAMEFROMNUMBER T ARRAYBEG T COPYSTK T ARCTAN T ARCCOS T ARCSIN T ARCTAN2 T LOG
 T TAN T COS T SIN T GETTYPEDESCRIPTION T TYPENUMBERFROMNAME T DATEFORMAT T NTYP T SCODEP T 
COPYDEFCOPYREADTABLE T COVERS T GETQ T NCHAR T SUBTYPES T SUPERTYPES T STRINGWIDTH T \ALLOCKBLOCK T 
HARRAYSIZE T HARRAY T ELTD T COPYARRAY T HARRAYP T ARRAYTYP T ARRAYSIZE T BIT T U-CASEP T L-CASE T 
STREQUAL T CONCAT T EQUALALL T READP T ALLOCSTRING T PEEKC T LOWERCASE T EXPT T SQRT T IDATE T FNTH T 
FTIMES T FLOAT T FPLUS T FMINUS T LESSP T FREMAINDER T REMAINDER T ABS T IEQP T MINUS T GCD T ADD1 T 
SUB1 T LOGXOR T LOGOR T ITIMES T IPLUS T IMINUS T ILESSP T MINUSP T RSH T LSH T LRSH T EQP T IQUOTIENT
 T IGREATERP T IDIFFERENCE T ASSOC T NTH T GETATOMVAL T NARGS T ARGTYPE T FNTYP T SUBRP T CCODEP T 
VARS T EXPRP T REALSTKNTH T REALFRAMEP T MAX T LEQ T IMIN T IMAX T ILEQ T IGEQ T FMIN T FMAX T FLESSP 
T PROG1 T PROG2 T BOUNDP T TYPENAME T MKLIST T FREEVARS T EQMEMB T ARG T PAGEFAULTS T DISMISS T DATE T
 CLOCK T COUNTDOWN T NCHARS T GETD T SUBLIS T NUMBERP T ATOM T NLISTP T EQUALN T COPYALL T PROGN T 
MKATOM T MEMB T SUBSTRING T MKSTRING T PACK* T EQUAL T MINFS T CHCON1 T SUBATOM T FULLNAME T INFILEP T
 FCHARACTER T CHARACTER T STRPOS T PACKFILENAME T U-CASE T FASSOC T APPEND T NOT T LOGAND T ZEROP T 
GETPROPLIST T VAG T LOC T EQ T LENGTH T GETTOPVAL T FIELDLOOK T GETTEMPLATE T RECLOOK T HASDEF T 
PROPNAMES T LLSH T ARRAY T TYPESOF T EQLENGTH T UNION T SUBSET T REMOVE T RPT T LISTPUT1 T LISTPUT T 
LISTGET1 T LISTGET T LDIFFERENCE T LDIFF T LASTN T KWOTE T MEMBER T INTERSECTION T GETLIS T GENSYM T 
LSUBST T SUBST T FIX T COUNT T LIST T FGETD T LAST T NULL T TYPENAMEP T FLTFMT T LINELENGTH T SASSOC T
 GREATERP T FGREATERP T FQUOTIENT T FDIFFERENCE T IREMAINDER T QUOTIENT T TIMES T DIFFERENCE T PLUS T 
\VAG2 T UNPACKFILENAME T NILL T FONTNAME T NTHCHARCODE T ELT T CONS T GETHASH T FMEMB T GETPROP T 
OPENP T STACKP T STRINGP T ARRAYP T LISTP T LITATOM T FLOATP T FIXP T SMALLP T TYPEP T MIN T GDATE T 
OPENR T MAKEBITTABLE T STRPOSL T PACK T PACKC T ALPHORDER T FLAST T UNPACK T CHCON T TAILP T NLEFT T 
FLENGTH T SYNTAXP T GETSEPR T GETREADTABLE T GETSYNTAX T VARIABLES T GETTERMTABLE }))

(PUTPROPS NO.SIDEEFFECTS.HARRAY GLOBALVAR T)
(DECLARE: DOEVAL@COMPILE DONTCOPY

(ADDTOVAR GLOBALVARS CLISPARRAY CONSTANTFOLDFNS)
)
(PUTPROPS MACROAUX COPYRIGHT ("Xerox Corporation" 1983))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (2910 3335 (\MACRO...ppmacro 2920 . 3333)) (3954 7030 (ARGS.COMMUTABLEP.LIST 3964 . 4157
) (EVALUABLE.CONSTANT.FIXP 4159 . 4326) (LISPFORM.SIMPLIFY 4328 . 5743) (NO.SIDEEFFECTS.FNP 5745 . 
6302) (CARCDR.FNP 6304 . 6526) (CODE.SUBST 6528 . 6774) (CODE.SUBPAIR 6776 . 7028)) (7247 13964 (
ARGS.COMMUTABLEP 7257 . 9112) (ARGS.COMMUTABLEP.LIST 9114 . 9307) (VAR.NOT.USED 9309 . 9720) (
\VARNOTUSED 9722 . 11078) (\VARNOTUSED.LIST 11080 . 11279) (EVALUABLE.CONSTANTP 11281 . 13793) (
EVALUABLE.CONSTANT.FIXP 13795 . 13962)) (14084 16980 (\WALKOVER.SPECIALFORMS 14094 . 16166) (
\WALKOVER.SF.LIST 16168 . 16364) (\WALKOVER.FUNCTION 16366 . 16978)))))
STOP