(FILECREATED "25-SEP-83 23:55:57" <NEWLISP>WEDIT.;4   29738

      changes to:  (USERMACROS SWAPC LOWER RAISE SWAP GO)
		   (FNS SWAPPEDCOND COND.TO.IF)
		   (VARS WEDITCOMS)

      previous date: "18-JUL-83 21:55:09" <NEWLISP>WEDIT.;2)


(* Copyright (c) 1982, 1983 by Xerox Corporation)

(PRETTYCOMPRINT WEDITCOMS)

(RPAQQ WEDITCOMS [(VARS EDITOPS MAXLOOP (EDITRACEFN)
			(UPFINDFLG T)
			MAXLEVEL FINDFLAG (EDITQUIETFLG))
	[INITVARS (EDITSMASHUSERFN)
		  (EDITEMBEDTOKEN (QUOTE &))
		  (EDITUSERFN)
		  (CHANGESARRAY)
		  (EDITUNSAVEBLOCKFLG T)
		  (EDITLOADFNSFLG (QUOTE (T]
	(INITVARS (EDITMACROS)
		  (USERMACROS))
	(ADDVARS (HISTORYCOMS ?? REDO REPEAT FIX USE ... NAME RETRIEVE DO !N !E !F TYPE-AHEAD  
			      BUFS ;)
		 (DONTSAVEHISTORYCOMS SAVE P ? PP PP* E ;)
		 (EDITCOMSA OK STOP SAVE TTY: E ? PP PP* PPV P ↑ !0 MARK UNDO !UNDO TEST UNBLOCK ← \ 
			    \P ←← F BF UP DELETE NX BK !NX ?? REDO REPEAT FIX USE NAME RETRIEVE DO !N 
			    !E !F TYPE-AHEAD)
		 (EDITCOMSL S R R1 RC RC1 E I N P F FS F= ORF BF NTH IF RI RO LI LO BI BO M NX BK ORR 
			    MBD XTR THRU TO A B : AFTER BEFORE MV LP LPQ LC LCL ← BELOW SW BIND COMS 
			    ORIGINAL INSERT REPLACE CHANGE DELETE EMBED SURROUND MOVE EXTRACT SWITCH 
			    ?? REDO REPEAT FIX USE NAME RETRIEVE DO MARK \))
	(USERMACROS CAP LOWER RAISE 2ND 3RD %%F %% NEX REPACK * >* SHOW EXAM PP*)
	(* * control chars for moving around in the editor)
	(FNS SETTERMCHARS INTCHECK CHARMACRO)
	(INITVARS (EDITCHARACTERS))
	(VARS NEGATIONS)
	(USERMACROS 2P NXP BKP -1P)
	(ADDVARS (COMPACTHISTORYCOMS 2P NXP BKP -1P))
	(DECLARE: DONTCOPY (MACROS CFOBF))
	(BLOCKS (SETTERMCHARS SETTERMCHARS INTCHECK (NOLINKFNS . T)
			      (GLOBALVARS EDITRDTBL))
		(NIL CHARMACRO (LOCALVARS . T)))
	(* * macros for calling editor)
	(USERMACROS EF EV EP)
	(ADDVARS (DONTSAVEHISTORYCOMS EF EV EP))
	(FNS FIRSTATOM)
	(BLOCKS (NIL FIRSTATOM (LOCALVARS . T)))
	(* * Misc edit macros)
	(USERMACROS EVAL Q GETD GETVAL MAKEFN D NEGATE GO SWAP MAKE SWAPC BQUOTE IFY SPLITC JOINC)
	(FNS MAKEFN EDITGETD NEGATE NEGL NEGLST NEGC MKPROGN MKPROGN1 MAKECOM SWAPPEDCOND BQUOTIFY 
	     COND.TO.IF)
	(BLOCKS (NEGATE NEGATE NEGL NEGLST NEGC (NOLINKFNS . T)
			(GLOBALVARS NEGATIONS))
		(MKPROGN MKPROGN MKPROGN1 (NOLINKFNS . T)))
	(GLOBALVARS CLISPARRAY MACROPROPS)
	(LOCALVARS . T)
	(* * Time stamp on functions when edited)
	(DECLARE: DONTCOPY (P (* User enables this by an (ADDTOVAR INITIALSLIST (USERNAME . initials:)
								   )
				 in his INIT.LISP. E.g. (ADDTOVAR INITIALSLIST (MASINTER . lmm:))
				 - The date fixup is enabled by the variable INITIALS. The function 
				 SETINITIALS sets INITIALS from INITIALSLIST and USERNAME at load 
				 time, and after a sysin.)))
	(FNS FIXEDITDATE EDITDATE? EDITDATE SETINITIALS)
	(INITVARS (INITIALS)
		  (INITIALSLST)
		  (DEFAULTINITIALS (QUOTE edited:)))
	(GLOBALVARS LAMBDASPLST NORMALCOMMENTSFLG COMMENTFLG FIRSTNAME INITIALS INITIALSLST 
		    DEFAULTINITIALS FILEPKGFLG DFNFLG)
	(P (MOVD? (QUOTE NILL)
		  (QUOTE PREEDITFN)))
	(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA)
									      (NLAML MAKECOM 
										     CHARMACRO)
									      (LAMA])

(RPAQQ EDITOPS ((INSERT (BEFORE AFTER FOR)
			(EDIT: #2 #3 #1))
		(REPLACE (WITH BY)
			 (EDIT: : #1 #3))
		(CHANGE (TO)
			(EDIT: : #1 #3))
		(DELETE NIL (EDIT: : #1))
		(EMBED (IN WITH)
		       (EDITMBD #1 #3))
		(SURROUND (WITH IN)
			  (EDITMBD #1 #3))
		(MOVE (TO)
		      (EDITMV #1 (CAR #3)
			      (CDR #3)))
		(EXTRACT (FROM)
			 (EDITXTR #3 #1))
		(SWITCH (AND)
			(EDITSW #1 #3))))

(RPAQQ MAXLOOP 30)

(RPAQQ EDITRACEFN NIL)

(RPAQQ UPFINDFLG T)

(RPAQQ MAXLEVEL 300)

(RPAQQ FINDFLAG NIL)

(RPAQQ EDITQUIETFLG NIL)

(RPAQ? EDITSMASHUSERFN )

(RPAQ? EDITEMBEDTOKEN (QUOTE &))

(RPAQ? EDITUSERFN )

(RPAQ? CHANGESARRAY )

(RPAQ? EDITUNSAVEBLOCKFLG T)

(RPAQ? EDITLOADFNSFLG (QUOTE (T)))

(RPAQ? EDITMACROS )

(RPAQ? USERMACROS )

(ADDTOVAR HISTORYCOMS ?? REDO REPEAT FIX USE ... NAME RETRIEVE DO !N !E !F TYPE-AHEAD  BUFS ;)

(ADDTOVAR DONTSAVEHISTORYCOMS SAVE P ? PP PP* E ;)

(ADDTOVAR EDITCOMSA OK STOP SAVE TTY: E ? PP PP* PPV P ↑ !0 MARK UNDO !UNDO TEST UNBLOCK ← \ \P ←← F 
		       BF UP DELETE NX BK !NX ?? REDO REPEAT FIX USE NAME RETRIEVE DO !N !E !F 
		       TYPE-AHEAD)

(ADDTOVAR EDITCOMSL S R R1 RC RC1 E I N P F FS F= ORF BF NTH IF RI RO LI LO BI BO M NX BK ORR MBD XTR 
		      THRU TO A B : AFTER BEFORE MV LP LPQ LC LCL ← BELOW SW BIND COMS ORIGINAL 
		      INSERT REPLACE CHANGE DELETE EMBED SURROUND MOVE EXTRACT SWITCH ?? REDO REPEAT 
		      FIX USE NAME RETRIEVE DO MARK \)

(ADDTOVAR EDITMACROS [REPACK NIL (IF (LISTP (##))
				     (1)
				     NIL)
			     (I : ([LAMBDA (X Y)
					   (SETQ COM (QUOTE REPACK))
					   [SETQ Y (APPLY (QUOTE CONCAT)
							  (EDITE (UNPACK X]
					   [COND ((NOT (STRINGP X))
						  (SETQ Y (MKATOM Y]
					   (PRINT Y T T]
				 (##]
		     (* X MARK [ORR [(I >* (COND [(RAISEP)
						  (CONS (QUOTE *)
							(CONS (QUOTE %%)
							      (QUOTE X]
						 (T (CONS (QUOTE *)
							  (QUOTE X]
				    ((E (QUOTE CAN'T]
			←←)
		     (CAP NIL RAISE (I 1 (L-CASE (## 1)
						 T)))
		     [LOWER (C)
			    (I R (QUOTE C)
			       (L-CASE (QUOTE C]
		     (RAISE (C)
			    (I R (L-CASE (QUOTE C))
			       (QUOTE C)))
		     (RAISE NIL UP (I 1 (U-CASE (## 1)))
			    1)
		     [LOWER NIL UP (I 1 (L-CASE (## 1]
		     [2ND X (ORR ((LC . X)
				  (LC . X]
		     [3RD X (ORR ((LC . X)
				  (LC . X)
				  (LC . X]
		     (%%F (X Y)
			  (E (EDITQF (L-CASE (QUOTE X)
					     (QUOTE Y)))
			     T))
		     [%% X (COMS (CONS (CAR (QUOTE X))
				       (COMMENT3 (CDR (QUOTE X))
						 (CAR (LAST L]
		     (NEX NIL (BELOW ←)
			  NX)
		     (NEX (X)
			  (BELOW X)
			  NX)
		     [REPACK NIL (IF (LISTP (##))
				     (1)
				     NIL)
			     (I : ([LAMBDA (X Y)
					   (SETQ COM (QUOTE REPACK))
					   [SETQ Y (APPLY (QUOTE CONCAT)
							  (EDITE (UNPACK X]
					   [COND ((NOT (STRINGP X))
						  (SETQ Y (MKATOM Y]
					   (PRINT Y T T]
				 (##]
		     (REPACK (X)
			     (LC . X)
			     REPACK)
		     (>* (X)
			 (BIND (MARK #1)
			       0
			       (← ((*ANY* PROG PROGN COND SELECTQ LAMBDA NLAMBDA ASSEMBLE)
				   --))
			       (MARK #2)
			       (E (SETQ #3 (SELECTQ (## 1)
						    ((COND SELECTQ)
						     2)
						    1))
				  T)
			       (\ #1)
			       (ORR (1 1)
				    (1)
				    NIL)
			       (BELOW (\ #2)
				      #3)
			       (IF (QUOTE X)
				   [(ORR (NX (B X))
					 ((IF (EQ (## (\ #2)
						      0 1)
						  (QUOTE PROG))
					      NIL
					      (BK))
					  (A X))
					 ((\ #2)
					  (>* X]
				   NIL)))
		     (SHOW X (F (*ANY* . X)
				T)
			   (LPQ MARK (ORR (1 !0)
					  NIL)
				P ←← (F (*ANY* . X)
					N))
			   (E (QUOTE done)))
		     (EXAM X (F (*ANY* . X)
				T)
			   (BIND (LPQ (MARK #1)
				      (ORR (1 !0 P)
					   NIL)
				      (MARK #2)
				      TTY:
				      (MARK #3)
				      (IF (EQ (## (\ #3))
					      (## (\ #2)))
					  ((\ #1))
					  NIL)
				      (F (*ANY* . X)
					 N)))
			   (E (QUOTE done)))
		     (PP* NIL (RESETVAR **COMMENT**FLG NIL PP)))

(ADDTOVAR EDITCOMSA CAP LOWER RAISE NEX REPACK PP*)

(ADDTOVAR EDITCOMSL LOWER RAISE 2ND 3RD %%F %% REPACK * >* EXAM SHOW)

(ADDTOVAR DONTSAVEHISTORYCOMS PP*)
(* * control chars for moving around in the editor)

(DEFINEQ

(SETTERMCHARS
  (LAMBDA (NEXTCHAR BKCHAR LASTCHAR UNQUOTECHAR 2CHAR PPCHAR)
                                                            (* lmm "11-SEP-78 04:57")
    (COND
      ((SETQ NEXTCHAR (INTCHECK NEXTCHAR))                  (* NEXTCHAR (usu. control-J) goes to the next entry)
	(/SETSYNTAX NEXTCHAR (QUOTE (MACRO FIRST IMMEDIATE (LAMBDA NIL
					     (CHARMACRO NXP))))
		    EDITRDTBL)))
    (COND
      ((SETQ LASTCHAR (INTCHECK LASTCHAR))                  (* LASTCHAR (usu. control-Z) to the editor will go to 
							    the last thing and print it)
	(/SETSYNTAX LASTCHAR (QUOTE (MACRO FIRST IMMEDIATE (LAMBDA NIL
					     (CHARMACRO -1P))))
		    EDITRDTBL)
	(/ECHOCONTROL LASTCHAR (QUOTE IGNORE))))
    (COND
      ((SETQ 2CHAR (INTCHECK 2CHAR))                        (* 2CHAR (usu. Control N) to the editor will go to 2 
							    (or 1) and print it)
	(/SETSYNTAX 2CHAR (QUOTE (MACRO FIRST IMMEDIATE (LAMBDA NIL
					  (CHARMACRO 2P))))
		    EDITRDTBL)
	(/ECHOCONTROL 2CHAR (QUOTE IGNORE))))
    (COND
      ((SETQ BKCHAR (INTCHECK BKCHAR))                      (* BKCHAR (usu. control H) to the editor will go back 
							    (or up) and then print)
	(/SETSYNTAX BKCHAR (QUOTE (MACRO FIRST IMMEDIATE ESCQUOTE (LAMBDA NIL
					   (CHARMACRO BKP))))
		    EDITRDTBL)
	(/ECHOCONTROL BKCHAR (QUOTE IGNORE))))
    (COND
      ((SETQ UNQUOTECHAR (INTCHECK UNQUOTECHAR))            (* UNQUOTECHAR (usu. control Y 
							    (Yank)) is an 'unquote' -- reads next thing and evals 
							    it)
	(/SETSYNTAX UNQUOTECHAR (QUOTE (MACRO FIRST (LAMBDA (FILE RDTBL)
						(EVAL (READ FILE RDTBL)))))
		    T)
	(/SETSYNTAX UNQUOTECHAR T EDITRDTBL)))
    (COND
      ((SETQ PPCHAR (INTCHECK PPCHAR))                      (* PPCHAR (usu. control-O) to the editor will print 
							    current expression)
	(/SETSYNTAX PPCHAR (QUOTE (SPLICE FIRST IMMEDIATE ESCQUOTE (LAMBDA NIL
					    (TERPRI T)
					    (## PP*)
					    (PRIN1 (QUOTE *)
						   T)
					    NIL)))
		    EDITRDTBL)
	(/ECHOCONTROL PPCHAR (QUOTE IGNORE))))))

(INTCHECK
  [LAMBDA (CHAR)                                            (* lmm "29-NOV-77 20:32")
    (PROG ((CHR CHAR)
	   NCHR)
          [COND
	    ((LISTP CHR)
	      (SETQ CHR (CAR CHR]
          (COND
	    ((NULL CHR)
	      (RETURN)))
          [COND
	    ((NOT (FIXP CHR))
	      (SETQ CHR (CHCON1 CHR]
          [COND
	    ((IGREATERP CHR 64)
	      (SETQ CHR (IDIFFERENCE CHR 64]
          (COND
	    ((NOT (GETINTERRUPT CHR))
	      (RETURN CHR)))
          (COND
	    ((NLISTP CHAR)
	      (PRIN1 "control-" T)
	      (PRIN1 (FCHARACTER (IPLUS CHR 64))
		     T)
	      (PRIN1 " is an interrupt and can't be an edit control-character" T)
	      (TERPRI T))
	    (T (COND
		 [(SETQ NCHR (CADR CHAR))
		   (OR (FIXP NCHR)
		       (SETQ NCHR (CHCON1 NCHR)))
		   [COND
		     ((IGREATERP NCHR 64)
		       (SETQ NCHR (IDIFFERENCE NCHR 64]
		   (INTCHAR (CONS NCHR (CDR (OR (INTCHAR CHR)
						(HELP]
		 (T (INTCHAR CHR)))
	       (RETURN CHR])

(CHARMACRO
  [NLAMBDA (X)                                              (* NOBIND "18-JUL-78 22:15")
    (CFOBF)                                                 (* clear file output buffer;
					no-op on dorado)
    (TERPRI T)
												     |
    X])
)

(RPAQ? EDITCHARACTERS )

(RPAQQ NEGATIONS ((NEQ . EQ)
		  (NLISTP . LISTP)
		  (GO . GO)
		  (ERROR . ERROR)
		  (ERRORX . ERRORX)
		  (RETURN . RETURN)
		  (RETFROM . RETFROM)
		  (RETTO . RETTO)
		  (IGREATERP . ILEQ)
		  (ILESSP . IGEQ)))

(ADDTOVAR EDITMACROS (NXP NIL [ORR (NX)
				   (!NX (E (PRIN1 "> " T)
					   T))
				   ((E (PROGN (SETQQ COM NX)
					      (ERROR!]
			  P)
		     [-1P NIL (ORR (-1 P)
				   ((E (PROGN (SETQQ COM -1)
					      (ERROR!]
		     (BKP NIL [ORR (BK)
				   (!0)
				   ((E (PROGN (SETQQ COM BK)
					      (ERROR!]
			  P)
		     (2P NIL [ORR (2)
				  (1)
				  ((E (PROGN (SETQQ COM 2)
					     (ERROR!]
			 P))

(ADDTOVAR EDITCOMSA NXP -1P BKP 2P)

(ADDTOVAR COMPACTHISTORYCOMS 2P NXP BKP -1P)

(ADDTOVAR COMPACTHISTORYCOMS 2P NXP BKP -1P)
(DECLARE: DONTCOPY 
(DECLARE: EVAL@COMPILE 

(PUTPROPS CFOBF MACRO (NIL (ASSEMBLE NIL
				     (MOVEI 1 , 101Q)
				     (JSYS 101Q))))

(PUTPROPS CFOBF DMACRO (NIL NIL))
)
)
[DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY
(BLOCK: SETTERMCHARS SETTERMCHARS INTCHECK (NOLINKFNS . T)
	(GLOBALVARS EDITRDTBL))
(BLOCK: NIL CHARMACRO (LOCALVARS . T))
]
(* * macros for calling editor)


(ADDTOVAR EDITMACROS [EV NIL (ORR [(E (LISPXEVAL (LIST (QUOTE EDITV)
						       (FIRSTATOM (##)))
						 (QUOTE EV->]
				  ((E (QUOTE EV?]
		     [EP NIL (ORR [(E (LISPXEVAL (LIST (QUOTE EDITP)
						       (FIRSTATOM (##)))
						 (QUOTE EP->]
				  ((E (QUOTE EP?]
		     [EF NIL (ORR [(E (LISPXEVAL (LIST (QUOTE EDITF)
						       (FIRSTATOM (##)))
						 (QUOTE EF->]
				  ((E (QUOTE EF?])

(ADDTOVAR EDITCOMSA EV EP EF)

(ADDTOVAR DONTSAVEHISTORYCOMS EF EV EP)

(ADDTOVAR DONTSAVEHISTORYCOMS EF EV EP)
(DEFINEQ

(FIRSTATOM
  [LAMBDA (X)                                               (* NOBIND "18-JUL-78 21:57")
                                                            (* Used by EF macro)
    (COND
      ((NLISTP X)
	X)
      (T (FIRSTATOM (CAR X])
)
[DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY
(BLOCK: NIL FIRSTATOM (LOCALVARS . T))
]
(* * Misc edit macros)


(ADDTOVAR USERMACROS (IFY NIL (F (COND --)
				 T)
			  UP
			  [I 1 (COND.TO.IF (CDR (## 1]
			  1))

(ADDTOVAR EDITMACROS (BQUOTE NIL UP [ORR [(I 1 (OR (CONS (QUOTE BQUOTE)
							 (OR (BQUOTIFY (## 1))
							     (ERROR!)))
						   (ERROR!]
					 ((E (QUOTE BQUOTE?]
			     1)
		     (SWAP (LC1 LC2)
			   (BIND (MARK #3)
				 (LC . LC1)
				 UP
				 (MARK #1)
				 (\ #3)
				 (LC . LC2)
				 UP
				 [IF (NOT (OR (FMEMB (CAAR #1)
						     L)
					      (FMEMB (CAAR L)
						     #1)))
				     ((E (SETQ #2 (CAR (##)))
					 T)
				      (\ #1)
				      (E (SETQ #1 (CAR (##)))
					 T)
				      (I 1 #2)
				      \
				      (I 1 #1))
				     ((E (QUOTE (NESTED EXPRESSIONS]
				 (\ #3)))
		     [EVAL NIL (ORR [(E (LISPXEVAL (## (ORR (UP 1)
							    NIL))
						   (QUOTE *]
				    ((E (QUOTE EVAL?]
		     [GO (LAB)
			 (ORR ((← ((*ANY* PROG ASSEMBLE DPROG RESETLST)
				   -- LAB --))
			       F LAB (ORR 2 1)
			       P)
			      ((E (PROGN (SETQQ COM LAB)
					 (ERROR!]
		     (JOINC NIL (F COND T)
			    UP
			    (BI 1 2)
			    1
			    (BO 2)
			    (2)
			    (RO 1)
			    (BO 1))
		     (NEGATE NIL UP (I 1 (NEGATE (## 1)))
			     1)
		     (SPLITC (X)
			     (F COND T)
			     (BI 1 X)
			     (IF [AND (EQ (## 2 1)
					  T)
				      (## 2 2)
				      (NULL (CDDR (##]
				 ((BO 2)
				  (2))
				 ((-2 COND)
				  (LI 2)))
			     UP
			     (BO 1))
		     (SWAPC NIL (F ((*ANY* COND IF if)
				    --)
				   T)
			    UP
			    (I 1 (SWAPPEDCOND (## 1)))
			    1)
		     (MAKE (VAR . VALS)
			   (COMS (MAKECOM VAR VALS)))
		     (D NIL (:)
			1 P)
		     (Q NIL (MBD QUOTE))
		     (MAKEFN (FORM ARGS N M)
			     [IF (QUOTE M)
				 ((BI N M)
				  (LC . N)
				  (BELOW \))
				 ((IF (QUOTE N)
				      ((BI N -1)
				       (LC . N)
				       (BELOW \))
				      ((LI 1]
			     (E (MAKEFN (QUOTE FORM)
					(QUOTE ARGS)
					(##))
				T)
			     UP
			     (1 FORM)
			     1)
		     (GETD NIL UP [ORR [(I 1 (OR [EDITGETD (## 1)
							   (AND (CDR L)
								(EDITL0 L (QUOTE (!0]
						 (ERROR!]
				       ((E (QUOTE GETD?]
			   1)
		     (GETVAL NIL UP [ORR [(I 1 (EVAL (## 1)
						     (QUOTE *]
					 ((E (QUOTE GETVAL?]
			     1))

(ADDTOVAR EDITCOMSA BQUOTE JOINC EVAL NEGATE SWAPC D Q GETD GETVAL)

(ADDTOVAR EDITCOMSL SPLITC MAKE MAKEFN SWAP GO)
(DEFINEQ

(MAKEFN
  [LAMBDA (FORM ARGLIST BODY)                               (* wt: " 2-MAR-79 20:47")
                                                            (* called from MAKEFN edit 
					macro)
    (COND
      ((AND (LITATOM FORM)
	    (FNTYP (CAR BODY))
	    (NULL (CDR BODY))
	    (NULL ARGLIST))
	(DEFINE (LIST (CONS FORM BODY)))
	(FIXEDITDATE (GETD FORM)))
      (T (PROG ((A ARGLIST)
												     |
		(ACTUAL (CDR FORM))
												     |
		DEF)
												     |
	       (OR (AND (LISTP FORM)
												     |
			(CAR FORM)
												     |
			(LITATOM (CAR FORM)))
												     |
		   (ERROR FORM "? " T))
												     |
	   LP  (COND
												     |
		 ((LISTP ACTUAL)
												     |
		   [COND
												     |
		     ((NLISTP A)
												     |
		       (SETQ ARGLIST
												     |
			 (NCONC ARGLIST
												     |
				(SETQ A
												     |
				  (LIST (COND
												     |
					  ((LITATOM (CAR ACTUAL))
												     |
					    (CAR ACTUAL))
												     |
					  (T (OR [CAR (SOME (QUOTE (X Y Z A B C D))
												     |
							    (FUNCTION (LAMBDA (X)
												     |
								(NOT (FMEMB X ARGLIST]
												     |
						 (GENSYM]
												     |
		   (AND (NEQ (CAR A)
												     |
			     (CAR ACTUAL))
												     |
			(ERSETQ (ESUBST (CAR A)
												     |
					(CAR ACTUAL)
												     |
					BODY)))
												     |
		   (SETQ A (CDR A))
												     |
		   (SETQ ACTUAL (CDR ACTUAL))
												     |
		   (GO LP)))
												     |
	       [DEFINE (LIST (LIST (CAR FORM)
												     |
				   (SETQ DEF (CONS (QUOTE LAMBDA)
												     |
						   (CONS ARGLIST BODY]
												     |
	       (FIXEDITDATE DEF])

(EDITGETD
  [LAMBDA (X EDITCHAIN)            (* wt: "10-OCT-78 11:57")
                                   (* used by the GETD edit macro)
    (AND (LISTP X)
	 (PROG (DEF TAIL (FN (CAR X)))
	       (RETURN (COND
			 ((LISTP FN)
			   (SELECTQ (CAR FN)
				    [LAMBDA (MKPROGN (SUBPAIR (CADR FN)
							      (CDR X)
							      (CDDR FN]
				    (OPENLAMBDA (EXPANDOPENLAMBDA FN (CDR X)))
				    NIL))
			 ((AND (GETLIS FN COMPILERMACROPROPS)
			       (NOT (EQUAL (SETQ DEF (EXPANDMACRO X T))
					   X)))
			   (COPY DEF))
			 [(GETPROP FN (QUOTE CLISPWORD))
			   [DWIMIFY X T (OR EDITCHAIN (QUOTE (NIL]
			   (COND
			     ((NEQ FN (CAR X))
                                   (* form changed)
			       X)
			     ((SETQ DEF (GETHASH X CLISPARRAY))
			       (COPY DEF]
			 ((SETQ DEF (GETDEF FN))
			   [SETQ TAIL (SUBSET (CDDR DEF)
					      (FUNCTION (LAMBDA (X)
						  (NEQ (CAR X)
						       (QUOTE *]
			   (COND
			     ((NULL (CADR DEF))
                                   (* no args)
			       (COPY (MKPROGN TAIL)))
			     ((OR (EQ (CAR DEF)
				      (QUOTE NLAMBDA))
				  (NLISTP (CADR DEF)))
                                   (* NLAMBDA)
                                   (* just open code it)
			       (CONS (CONS (CAR DEF)
					   (CONS (CADR DEF)
						 TAIL))
				     (CDR DEF)))
			     (T (MKPROGN (SUBPAIR (CADR DEF)
						  (CDR X)
						  TAIL T])

(NEGATE
  [LAMBDA (X)                      (* lmm " 6-DEC-80 16:00")
    (SELECTQ (CAR (LISTP X))
	     ((NOT NULL)
	       (CADR X))
	     [AND (CONS (QUOTE OR)
			(NEGLST (CDR X]
	     [OR (CONS (QUOTE AND)
		       (NEGLST (CDR X]
	     (ZEROP (LIST (QUOTE NEQ)
			  (CADR X)
			  0))
	     [COND (COND [[AND (NULL (CDDR X))
			       (NULL (CDR (CDADR X]
			   (NEGATE (CONS (QUOTE AND)
					 (CADR X]
			 (T (CONS (QUOTE COND)
				  (NEGC (CDR X]
	     [SELECTQ (CONS (QUOTE SELECTQ)
			    (CONS (CADR X)
				  (MAPLIST (CDDR X)
					   (FUNCTION (LAMBDA (X)
					       (COND
						 [(CDR X)
						   (CONS (CAAR X)
							 (NEGL (CDAR X]
						 (T (NEGATE (CAR X]
	     [PROGN (MKPROGN (NEGL (CDR X]
	     [PROG1 (CONS (QUOTE PROG1)
			  (CONS (NEGATE (CADR X))
				(CDDR X]
	     (QUOTE (NULL (CADR X)))
	     [(CONS)               (* functions which always return non-NIL)
	       (MKPROGN (APPEND (CDR X)
				(LIST NIL]
	     (COND
	       [(for Y in NEGATIONS do (COND
					 [(EQ (CAR Y)
					      (CAR X))
					   (RETURN (CONS (CDR Y)
							 (CDR X]
					 ((EQ (CDR Y)
					      (CAR X))
					   (RETURN (CONS (CAR Y)
							 (CDR X]
	       (T (OR (NULL X)
		      (AND (NEQ X T)
			   (NOT (OR (NUMBERP X)
				    (STRINGP X)))
			   (LIST (QUOTE NOT)
				 X])

(NEGL
  [LAMBDA (L)                                               (* lmm: " 7-FEB-77 17:17:51")
    (COND
      [(NULL (CDR L))
	(LIST (NEGATE (CAR L]
      (T (CONS (CAR L)
	       (NEGL (CDR L])

(NEGLST
  [LAMBDA (L)
    (MAPCAR L (FUNCTION NEGATE])

(NEGC
  (LAMBDA (X)                                               (* lmm "14-SEP-78 23:07")
    (COND
      ((NULL X)
	(LIST (LIST T T)))
      ((NULL (CDAR X))                                      (* (COND (A) . TAIL) -> (NOT 
							    (OR A (COND . TAIL))) -> (AND 
							    (NOT A) (NOT (COND . TAIL))))
	(LIST (LIST (NEGATE (CAAR X))
		    (OR (NULL (CDR X))
			(AND (SETQ X (NEGC (CDR X)))
			     (CONS (QUOTE COND)
				   X))))))
      (T (CONS (CONS (CAAR X)
		     (NEGL (CDAR X)))
	       (AND (NEQ (CAAR X)
			 T)
		    (NEGC (CDR X))))))))

(MKPROGN
  [LAMBDA (L)                                               (* wt: "18-JUL-78 12:57")
    (COND
      ((CDR (SETQ L (MKPROGN1 L)))
	(CONS (QUOTE PROGN)
	      L))
      (T (CAR L])

(MKPROGN1
  [LAMBDA (L)                                               (* lmm "21-SEP-77 15:19")
    (COND
      ((NULL (CDR L))
	(COND
	  ((EQ (CAAR L)
	       (QUOTE PROGN))
	    (CDAR L))
	  (T L)))
      ((NLISTP (CAR L))
	(MKPROGN1 (CDR L)))
      (T (SELECTQ (CAAR L)
		  [(PROGN LIST CONS CAR CDR NOT NULL)
		    (MKPROGN1 (APPEND (CDAR L)
				      (CDR L]
		  (QUOTE (MKPROGN1 (CDR L)))
		  (CONS (CAR L)
			(MKPROGN1 (CDR L])

(MAKECOM
  [NLAMBDA (VAR VALS)                                       (* wt: "19-JUL-78 11:35")
    (PROG (ARGNAMES (FORM (##)))
												     |
          (SETQ ARGNAMES (SMARTARGLIST (SETQ COM (CAR FORM))
				       NIL FORM))
          (OR [AND (LISTP ARGNAMES)
		   (OR (FMEMB (SETQ COM VAR)
			      ARGNAMES)
		       (SETQ VAR (FIXSPELL VAR NIL (APPEND ARGNAMES)
					   NIL]
	      (ERROR!))
          (RETURN (PROG (($$LST2 ARGNAMES)
												     |
			 $$VAL I ARG LST)                   (* (FOR I FROM 2 AS ARG IN VALS UNTIL ARG=VAR DO --))
												     |
		        (SETQ I 2)
		    $$LP[SETQ ARG (CAR (OR (LISTP $$LST2)
					   (GO $$OUT]
		        [COND
			  ((EQ ARG VAR)
			    (RETURN (COND
				      ((NOT (OR VALS (NULL (CDR FORM))
						(CDDR FORM)))
					(LIST I))
				      [(CDR FORM)
					(LIST I (COND
						((CDR VALS)
						  VALS)
						(T (CAR VALS]
				      (T (CONS (QUOTE N)
					       (NCONC1 LST (COND
												     |
							 ((CDR VALS)
												     |
							   VALS)
												     |
							 (T (CAR VALS]
												     |
		        [COND
			  ((NULL (SETQ FORM (CDR FORM)))
			    (SETQ LST (CONS NIL LST]
		    $$ITERATE
		        (SETQ I (IPLUS I 1))
		        (SETQ $$LST2 (CDR $$LST2))
		        (GO $$LP)
		    $$OUT
		        (ERROR!)
		        (RETURN $$VAL])

(SWAPPEDCOND
  [LAMBDA (CND)                    (* lmm "25-SEP-83 23:50")
    (SELECTQ (CAR CND)
	     [(IF if)
	       (DWIMIFY CND T L)
	       (COND.TO.IF (CDR (SWAPPEDCOND (COND
					       ((EQ (CAR CND)
						    (QUOTE COND))
						 CND)
					       ((GETHASH CND CLISPARRAY))
					       (T (ERROR!]
	     [COND (PROG ((C1 (CADR CND))
			  (CTAIL (CDDR CND))
			  (C2 (CADDR CND)))
			 (if (NOT (CDR C1))
			     then 
                                   (* cannot negate (COND (A) --))
				  (ERROR!))
			 (RETURN (CONS (QUOTE COND)
				       (CONS [CONS (NEGATE (CAR C1))
						   (OR (AND (EQ (CAR C2)
								T)
							    (CDR C2))
						       (COND
							 ((NULL CTAIL)
                                   (* only one clause. Turn (COND (A --)) into 
				   (COND ((NOT A) NIL) (T --)))
							   (LIST NIL))
							 (T 
                                   (* embed multiple subsequent clauses into one COND)
							    (LIST (CONS (QUOTE COND)
									CTAIL]
					     (COND
					       ((AND (NULL (CDDR C1))
						     (EQ (CAADR C1)
							 (QUOTE COND)))
                                   (* consequent of first clause is a COND itself.
				   Expand out in the tail)
						 (CDADR C1))
					       ((AND (NULL (CADR C1))
						     (NULL (CDDR C1)))
                                   (* (COND (A NIL) --) when swapped doesn't need a final T clause)
						 NIL)
					       (T (LIST (CONS T (CDR C1]
	     (SHOULDNT])

(BQUOTIFY
  [LAMBDA (FORM)                   (* lmm "25-SEP-83 23:53")
                                   (* return either list of BQUOTE expression or NIL)
    (COND
      ((LISTP FORM)
	(SELECTQ (CAR FORM)
		 (QUOTE (LIST (CADR FORM)))
		 [LIST (LIST (for X in (CDR FORM) bind BQ join (COND
								 ((BQUOTIFY X))
								 (T (LIST (QUOTE ,)
									  X]
		 [CONS (LIST (NCONC (OR (BQUOTIFY (CADR FORM))
					(LIST (QUOTE ,)
					      (CADR FORM)))
				    (PROG [(BQ (BQUOTIFY (CADDR FORM]
				          (RETURN (COND
						    (BQ (CAR BQ))
						    (T (LIST (QUOTE .,)
							     (CADDR FORM]
		 NIL))
      ((OR (NUMBERP FORM)
	   (STRINGP FORM)
	   (EQ FORM T)
	   (NULL FORM))
	(LIST FORM])

(COND.TO.IF
  [LAMBDA (CONDCLAUSES)            (* lmm "25-SEP-83 23:47")
    (CONS (QUOTE if)
	  (CDR (for X in CONDCLAUSES join (COND
					    ((AND (EQ (CAR X)
						      T)
						  (NEQ X (CAR CONDCLAUSES)))
					      (CONS (QUOTE else)
						    (CDR X)))
					    (T (CONS (QUOTE elseif)
						     (CONS (CAR X)
							   (COND
							     ((CDR X)
							       (CONS (QUOTE then)
								     (APPEND (CDR X])
)
[DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY
(BLOCK: NEGATE NEGATE NEGL NEGLST NEGC (NOLINKFNS . T)
	(GLOBALVARS NEGATIONS))
(BLOCK: MKPROGN MKPROGN MKPROGN1 (NOLINKFNS . T))
]
(DECLARE: DOEVAL@COMPILE DONTCOPY

(ADDTOVAR GLOBALVARS CLISPARRAY MACROPROPS)
)
(DECLARE: DOEVAL@COMPILE DONTCOPY

(LOCALVARS . T)
)
(* * Time stamp on functions when edited)

(DECLARE: DONTCOPY 
(* User enables this by an (ADDTOVAR INITIALSLIST (USERNAME . initials:))
   in his INIT.LISP. E.g. (ADDTOVAR INITIALSLIST (MASINTER . lmm:))
   - The date fixup is enabled by the variable INITIALS. The function SETINITIALS sets INITIALS from 
   INITIALSLIST and USERNAME at load time, and after a sysin.)
)
(DEFINEQ

(FIXEDITDATE
  [LAMBDA (EXPR)                   (* NOBIND "18-JUL-78 21:11")
                                   (* Inserts or replaces previous edit date)
    (AND INITIALS (LISTP EXPR)
	 (FMEMB (CAR EXPR)
		LAMBDASPLST)
	 (LISTP (CDR EXPR))
	 (PROG ((E (CDDR EXPR)))
	   RETRY
	       [COND
		 ((NLISTP E)
		   (RETURN))
		 ((LISTP (CAR E))
		   (SELECTQ (CAAR E)
			    ((CLISP: DECLARE)
			      (SETQ E (CDR E))
			      (GO RETRY))
			    [BREAK1 (COND
				      ((EQ (CAR (CADAR E))
					   (QUOTE PROGN))
					(SETQ E (CDR (CADAR E)))
					(GO RETRY]
			    (ADV-PROG 
                                   (* No easy way to mark cleanly the date of an advised function)
				      (RETURN))
			    (COND
			      ((AND (EQ (CAAR E)
					COMMENTFLG)
				    (EQ (CADAR E)
					(QUOTE DECLARATIONS:)))
				(SETQ E (CDR E))
				(GO RETRY]
	       (COND
		 ((AND (LISTP (CDR E))
		       (EDITDATE? (CAR E)))
		   (/RPLACA E (EDITDATE (CAR E)
					INITIALS)))
		 (T (/ATTACH (EDITDATE NIL INITIALS)
			     E)))
	       (RETURN EXPR])

(EDITDATE?
  [LAMBDA (COMMENT)                                         (* rmk: " 6-JUN-82 15:25")

          (* Tests to see if a given common is in fact an edit date -- this has to be general enough to recognize the most 
	  comment comment forms while specific enough to not recognize things that are not edit dates)


    (DECLARE (LOCALVARS . T))
    (COND
      [(LISTP COMMENT)
	(COND
	  ((EQ (CAR COMMENT)
	       COMMENTFLG)
	    [COND
	      ((NULL NORMALCOMMENTSFLG)
		(SETQ COMMENT (GETCOMMENT COMMENT]
	    (OR (EQ (CADR COMMENT)
		    INITIALS)
		(AND (LITATOM (CAR (CDR COMMENT)))
		     (OR [AND (NULL (CDDR (CDDDDR COMMENT)))
			      (OR (STRINGP (CADDR COMMENT))
				  (EQ (NTHCHARCODE (CADR COMMENT)
						   -1)
				      (CHARCODE :]
			 (AND (AND (EQ (CAR (CDR COMMENT))
				       (QUOTE Edited))
				   (EQ (CAR (CDR (CDR COMMENT)))
				       (QUOTE by)))
			      (NULL (CDR (CDDDDR (CDDDDR COMMENT]
      ((STRINGP COMMENT])

(EDITDATE
  [LAMBDA (OLDATE INITLS)          (* lmm " 7-OCT-81 10:31")
                                   (* Generates a new date from an old one)
    (PROG (STR)
          (SETQ STR (SUBSTRING (SETQ STR (DATE))
			       1 15 STR))
          (RETURN (COND
		    ([OR (NLISTP OLDATE)
			 (NEQ (CAR OLDATE)
			      COMMENTFLG)
			 (NOT (STRINGP (CADDR OLDATE]
		      (LIST COMMENTFLG INITLS STR))
		    (T (RPLACA (CDR (RPLACA (CDR OLDATE)
					    INITLS))
			       STR)
		       OLDATE])

(SETINITIALS
  [LAMBDA NIL                      (* FOO "27-SEP-79 16:37")
                                   (* (TEITELMAN . wt:) "20-SEP-79 13:50")
    (RESETVARS (FILEPKGFLG (DFNFLG T))
	       (RETURN (PROG (TEM)
			     (RETURN (COND
				       [(SETQ TEM (FASSOC (MKATOM (USERNAME))
							  INITIALSLST))
					 (COND
					   ((NLISTP (CDR TEM))
					     (SAVESET (QUOTE INITIALS)
						      (CDR TEM)))
					   (T (SAVESET (QUOTE FIRSTNAME)
						       (CADR TEM))
					      (SAVESET (QUOTE INITIALS)
						       (CADDR TEM]
				       (T (SAVESET (QUOTE INITIALS)
						   DEFAULTINITIALS])
)

(RPAQ? INITIALS )

(RPAQ? INITIALSLST )

(RPAQ? DEFAULTINITIALS (QUOTE edited:))
(DECLARE: DOEVAL@COMPILE DONTCOPY

(ADDTOVAR GLOBALVARS LAMBDASPLST NORMALCOMMENTSFLG COMMENTFLG FIRSTNAME INITIALS INITIALSLST 
	  DEFAULTINITIALS FILEPKGFLG DFNFLG)
)
(MOVD? (QUOTE NILL)
       (QUOTE PREEDITFN))
(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS 

(ADDTOVAR NLAMA )

(ADDTOVAR NLAML MAKECOM CHARMACRO)

(ADDTOVAR LAMA )
)
(PUTPROPS WEDIT COPYRIGHT ("Xerox Corporation" 1982 1983))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (7403 10775 (SETTERMCHARS 7413 . 9546) (INTCHECK 9548 . 10505) (CHARMACRO 10507 . 10773)
) (12515 12782 (FIRSTATOM 12525 . 12780)) (15230 25339 (MAKEFN 15240 . 17009) (EDITGETD 17011 . 18436)
 (NEGATE 18438 . 19783) (NEGL 19785 . 19995) (NEGLST 19997 . 20053) (NEGC 20055 . 20644) (MKPROGN 
20646 . 20845) (MKPROGN1 20847 . 21307) (MAKECOM 21309 . 22646) (SWAPPEDCOND 22648 . 24151) (BQUOTIFY 
24153 . 24896) (COND.TO.IF 24898 . 25337)) (26031 29199 (FIXEDITDATE 26041 . 27103) (EDITDATE? 27105
 . 28076) (EDITDATE 28078 . 28581) (SETINITIALS 28583 . 29197)))))
STOP