(FILECREATED "24-JUL-83 22:55:26" <NEWLISP>PRETTY.;2 96513 changes to: (FNS ISTTYP) previous date: "20-JUL-83 12:04:57" <NEWLISP>PRETTY.;1) (PRETTYCOMPRINT PRETTYCOMS) (RPAQQ PRETTYCOMS [(FNS PRETTYDEF PRETTYDEF0 PRETTYDEF1 PRINTDATE PRINTDATE1 PRINTFNS PRETTYCOM PRETTYCOMPRINT PRETTYVAR PRETTYVAR1 PRETTYCOM1 ENDFILE MAKEDEFLIST PP PP* PPT PRETTYPRINT PRETTYPRINT1 PRETTYPRINT2 PRINTDEF1 PRINTDEF SUPERPRINT SUPERPRINT0 SUPERPRINTEQ SUPERPRINTGETPROP RPARS SUBPRINT SUBPRINT1 SUBPRINT2 CHANGEFONT CHANGFONT PRINTPROG ENDLINE ENDLINE1 TABTO READARRAY FITP FITP1 FITP2 WIDEPAPER ISTTYP) (COMS (* COPYRIGHT) (FNS PRINTCOPYRIGHT PRINTCOPYRIGHT1 SAVECOPYRIGHT) (BLOCKS (NIL PRINTCOPYRIGHT PRINTCOPYRIGHT1 SAVECOPYRIGHT (LOCALVARS . T) (NOLINKFNS PRINTCOPYRIGHT1))) (GLOBALVARS COPYRIGHTFLG COPYRIGHTOWNERS DEFAULTCOPYRIGHTKEYLST DEFAULTCOPYRIGHTOWNER) [INITVARS (COPYRIGHTFLG) (DEFAULTCOPYRIGHTOWNER) (COPYRIGHTPRETTYFLG T) (COPYRIGHTOWNERS) (DEFAULTCOPYRIGHTKEYLST (QUOTE ((NONE " " EXPLAINSTRING "NONE - No copyright ever on this file" CONFIRM T RETURN (QUOTE NONE)) [%[ "owner: " EXPLAINSTRING "[ - new copyright owner -- type one line of text" NOECHOFLG T KEYLST (( " " RETURN (SUBSTRING (CADR ANSWER) 2 -2] (%] "No copyright notice now " EXPLAINSTRING "] - no copyright notice now" NOECHOFLG T RETURN NIL] (GLOBALVARS COPYRIGHTOWNERS DEFAULTCOPYRIGHTKEYLST COPYRIGHTPRETTYFLG COMMENTFLG)) (FNS COMMENT1 COMMENT2 COMMENT3 COMMENT4 COMMENT5) (INITVARS (BRLST) (COMMENTFLG (QUOTE *)) (**COMMENT**FLG (QUOTE " **COMMENT** ")) (PRETTYFLG T) (#RPARS 4) (CLISPIFYPRETTYFLG) (PRETTYTRANFLG) (FONTCHANGEFLG) (CHANGECHARTABSTR) (PRETTYTABFLG T) (DECLARETAGSLST (QUOTE (COMPILERVARS COPY COPYWHEN DOCOPY DOEVAL@COMPILE DOEVAL@LOAD DONTCOPY DONTEVAL@COMPILE DONTEVAL@LOAD EVAL@COMPILE EVAL@COMPILEWHEN EVAL@LOAD EVAL@LOADWHEN FIRST NOTFIRST))) (WIDEPAPERFLG) (AVERAGEVARLENGTH 4) (AVERAGEFNLENGTH 5) (#CAREFULCOLUMNS 0) (CHANGECHAR (QUOTE %|)) (LASTFONT) (ENDLINEUSERFN)) [INITVARS (PRETTYDEFMACROS) (PRETTYPRINTMACROS) (PRETTYEQUIVLST) (PRETTYPRINTYPEMACROS) (FILEPKGCOMSPLST (QUOTE (DECLARE: SPECVARS LOCALVARS GLOBALVARS PROP IFPROP P VARS INITVARS ADDVARS APPENDVARS FNS ARRAY E COMS ORIGINAL ADVISE ADVICE BLOCKS *))) (SYSPROPS (QUOTE (PROPTYPE ALISTTYPE DELDEF EDITDEF PUTDEF GETDEF WHENCHANGED NOTICEFN NEWCOMFN PRETTYTYPE DELFROMPRETTYCOM ADDTOPRETTYCOM ACCESSFN ACS ADVICE ADVISED ALIAS AMAC ARGNAMES BLKLIBRARYDEF BRKINFO BROADSCOPE BROKEN BROKEN-IN CLISPCLASS CLISPCLASSDEF CLISPFORM CLISPIFYISPROP CLISPINFIX CLISPISFORM CLISPISPROP CLISPNEG CLISPTYPE CLISPWORD CLMAPS CODE CONVERT COREVAL CROPS CTYPE EDIT-SAVE EXPR FILE FILECHANGES FILEDATES FILEDEF FILEGROUP FILEHISTORY FILEMAP FILETYPE GLOBALVAR HISTORY I.S.OPR I.S.TYPE INFO LASTVALUE LISPFN MACRO MAKE NAMESCHANGED NARGS OLDVALUE OPD READVICE SETFN SUBR UBOX UNARYOP VALUE \DEF CLISPBRACKET TRYHARDER] (DECLARE: DONTCOPY EVAL@COMPILE (FILES (IMPORT) FILEPKG)) [DECLARE: DONTEVAL@LOAD DOCOPY (P (WIDEPAPER) (SETLINELENGTH) (MOVD? (QUOTE ISTTYP) (QUOTE DISPLAYP)) (MOVD? (QUOTE NILL) (QUOTE COMPUTEPRETTYPARMS] (BLOCKS (PRETTYPRINTBLOCK PRETTYPRINT PRETTYPRINT1 PRETTYPRINT2 (ENTRIES PRETTYPRINT) (SPECVARS FNSLST FILEFLG)) (PRETTYBLOCK PRINTDEF SUPERPRINT SUPERPRINT0 SUPERPRINTEQ SUPERPRINTGETPROP SUBPRINT SUBPRINT1 SUBPRINT2 CHANGFONT PRINTPROG RPARS ENDLINE ENDLINE1 TABTO FITP FITP1 FITP2 COMMENT1 COMMENT2 (ENTRIES PRINTDEF CHANGFONT ENDLINE1 COMMENT1 FITP SUPERPRINTEQ SUPERPRINTGETPROP) (LOCALFREEVARS I LASTCOL FORMFLG E TAIL TAILFLG EXPR CRCNT FILEFLG FNSLST CHANGEFLG DEF) (BLKLIBRARY GETPROP) (SPECVARS CHANGEFLG LASTCOL FILEFLG E TAIL EXPR TYPE)) (NIL CHANGEFONT COMMENT3 COMMENT4 COMMENT5 ENDFILE ISTTYP MAKEDEFLIST PP PP* PPT PRETTYCOM PRETTYCOM1 PRETTYCOMPRINT PRETTYDEF PRETTYDEF0 PRETTYDEF1 PRETTYVAR PRETTYVAR1 PRINTDATE PRINTDATE1 PRINTDEF1 PRINTFNS READARRAY WIDEPAPER (LINKFNS . T))) (GLOBALVARS UCASELST LCASELST DECLARETAGSLST LISPXPRINTFLG SYSPROPS FILEPKGCOMSPLST DWIMLOADFNSFLG LAMBDAFONTLINELENGTH PRETTYCOMFONT WIDEPAPERFLG PRETTYHEADER BUILDMAPFLG FILERDTBL NORMALCOMMENTSFLG FILELINELENGTH FONTFNS FONTWORDS USERFONT CLISPFONT SYSTEMFONT COMMENTFONT CHANGEFONT PRETTYTABFLG AVERAGEFNLENGTH AVERAGEVARLENGTH #CAREFULCOLUMNS CHANGECHAR LASTFONT CHANGEFLG0 DISPLAYTERMFLG UNDERLINEON UNDERLINEOFF PRETTYEQUIVLST COMMENTLINELENGTH CHANGEFLG0 ENDLINEUSERFN FONTPROFILE PRETTYFLG CHANGESARRAY PRETTYPRINTYPEMACROS PRETTYPRINTMACROS CLISPTRANFLG PRETTYTRANFLG CLISPARRAY #RPARS CLISPCHARS FUNNYATOMLST CHCONLST CLISPFLG PRETTYLCOM FIRSTCOL **COMMENT**FLG ABBREVLST CHANGECHARTABSTR FILEPKGFLG FONTCHANGEFLG DEFAULTFONT LAMBDAFONT CLISPIFYPRETTYFLG LISPXHISTORY DWIMFLG USERWORDS ADDSPELLFLG COMMENTFLG CLISPIFYPACKFLG) (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA PPT PP* PP) (NLAML PRETTYCOMPRINT) (LAMA]) (DEFINEQ (PRETTYDEF [LAMBDA (PRTTYFNS PRTTYFILE PRTTYCOMS REPRINTFNS SOURCEFILE CHANGES) (* rmk: "20-FEB-83 15:57") (RESETLST [RESETSAVE (RESETUNDO) (QUOTE (AND RESETSTATE (RESETUNDO OLDVALUE] (* Says undo everything if there is an error or control-D This is particularly necessary if user is using the PRINT* prettyprintmacro which updates comments to point to the newest version.) (PROG ((PRTYX (OUTPUT)) FILEFLG FNSLST PRTYOPENFLG PRTTYTEM PRETTYCOMSLST PRTTYSPELLFLG OLDFILEMAP (NEWFILEMAP (AND BUILDMAPFLG (LIST NIL))) MAPADR NLAMALST NLAMLST LAMALST LAM?LST FILEDATES ORIGFLG ROOTNAME) (* NEWFILEMAP corresponds to the map being built for the file being written. OLDFILEMAP corresponds to the map that exists for SOURCEFILE, if any.) (COND ((LISTP PRTTYFILE) (SETQ PRTTYFILE (CAR PRTTYFILE)) (SETQ PRTYOPENFLG T))) (AND PRTTYFILE (NEQ PRTTYFILE T) (SETQ ROOTNAME (ROOTFILENAME PRTTYFILE))) (COND ((OR (EQ SOURCEFILE T) (AND REPRINTFNS (NULL SOURCEFILE))) (* SOURCEFILE plays the role of CFILE for recompiling. It permits PRETTYPRINT to obtain the definitions from the file withou having to reprettyprint them, or even having them loaded into core. T (or NIL if REPRINTFNS is specified) is the same as PRETTYFILE. - REPRINTFNS specifies those functions to be printed anew. REPRINTFNS=T means reprint all EXPRS, a la recompile. For example, if you have an entire file loaded in, but only change a few functions, using this option can speed up dumping the file by a factor of two. If REPRINTFNS=ALL, all functions that contain in core exprs, whether on function defiition cell or property lists, are reprinted. REPRINTFNS can also be a list. MAKEFILE uses this for the REMAKE option by specifying as REPRINTFNS the list CHANGES. In any case, if the function does not contain an in core defnition, prettyprint will try to find one on the file. i.e. act as though REPRINTFNS were NIL.) (SETQ SOURCEFILE ROOTNAME))) [COND (SOURCEFILE (COND ((NULL (XNLSETQ (INFILE SOURCEFILE) NOBREAK)) (* INFILE is called in order that 'correction' take place.) (SETQ SOURCEFILE NIL) (PRIN1 PRTTYFILE T) (PRIN1 (QUOTE " not found, so it will be written anew. ") T)) [(RANDACCESSP (SETQ SOURCEFILE (INPUT))) (RESETSAVE NIL (LIST (QUOTE CLOSEF) SOURCEFILE)) [COND ((EQ REPRINTFNS (QUOTE EXPRS)) (SETQ REPRINTFNS T)) ((EQ REPRINTFNS (QUOTE CHANGES)) (SETQ REPRINTFNS (UNION (FILEPKG.CHANGEDFNS CHANGES) (FILEPKG.CHANGEDFNS (fetch FILECHANGES of ROOTNAME] (COND [(NULL (SETQ OLDFILEMAP (GETFILEMAP SOURCEFILE (ROOTFILENAME SOURCEFILE] ((NULL (CAR OLDFILEMAP)) (* complete map.) ) ((LISTP (CAR OLDFILEMAP)) (* only partial map built up. should only happen for files that were made with BUILDMAPFLG=NIL, since otherwise there would be a coplete map on the file.) (SETFILEPTR SOURCEFILE (CAAR OLDFILEMAP))) (T (* Redundancy check. Should only occur if there was a compiled function in the file. and a partial map was formed that stopped after that function.) (HELP] (T (SETQ SOURCEFILE NIL] (RESETSAVE (SETREADTABLE FILERDTBL)) [COND [(NULL PRTTYFILE) (SETQ PRTYOPENFLG T) (SETQ NEWFILEMAP NIL) (SETQ FILEFLG (NOT (DISPLAYP (SETQ PRTTYFILE (OUTPUT] ((OPENP PRTTYFILE (QUOTE OUTPUT)) (OUTPUT PRTTYFILE) [SETQ FILEFLG (NOT (DISPLAYP (SETQ PRTTYFILE (OUTPUT] (* gets full name) ) (T (OUTFILE PRTTYFILE) [SETQ FILEFLG (NOT (DISPLAYP (SETQ PRTTYFILE (OUTPUT] (SETQ FILEDATES (PRINTDATE PRTTYFILE CHANGES)) (AND (NEQ COPYRIGHTFLG (QUOTE NEVER)) ROOTNAME (PRINTCOPYRIGHT ROOTNAME] (SETQ CHANGES (FILEPKG.CHANGEDFNS CHANGES)) (* Used freely by PRETTYPRINT to decide clispifying.) (COND ((NULL (RANDACCESSP PRTTYFILE)) (SETQ NEWFILEMAP NIL))) [COND ([AND FONTCHANGEFLG (OR FILEFLG (EQ FONTCHANGEFLG (QUOTE ALL] (* this is expensive in thatit costs as many conses as there are functions, but you can afford it for a makefile.) (SETQ FNSLST (OR (for FL in (GETPROP ROOTNAME (QUOTE FILEGROUP)) when (fetch FILEPROP of FL) join (FILEFNSLST FL)) (FILEFNSLST ROOTNAME] (AND (NULL PRTYOPENFLG) (RESETSAVE NIL (LIST (QUOTE PRETTYDEF0) PRTTYFILE))) (COND ((OR (LISTP PRTTYFNS) (LISTP (GETTOPVAL PRTTYFNS))) (PRINTFNS PRTTYFNS T) (PRETTYCOM PRTTYFNS T))) (COND ((AND (NLISTP PRTTYCOMS) (NLISTP (GETTOPVAL PRTTYCOMS))) (GO OUT))) (RESETVARS ((NORMALCOMMENTSFLG (QUOTE DONTUPDATE))) (PRETTYCOM PRTTYCOMS T)) (* PRTTYCOMS is just like the argument to a COMS command. see comment in prettycom1) [MAP (SETQ PRETTYCOMSLST (COND ((LITATOM PRTTYCOMS) (GETTOPVAL PRTTYCOMS)) (T PRTTYCOMS))) (FUNCTION (LAMBDA (L) (PRETTYCOM (CAR L) NIL L] (* The original value of PRTTYCOMS is saved so that it can be rewritten if a spelling correction occurs. The list PRTTYCOMSLST is searched by PRETTYCOM1 for * commands to see if the variable has be dumped out as well.) OUT (COND ((PRETTYDEF1) (* The coms were reprinted by PRETTYDEF1 due to a change to nlama and or nlaml) ) (PRTTYSPELLFLG (* A correction on prettycoms was performed, so dump it out aain to get the corrected version on the file.) (PRETTYCOM PRTTYCOMS T))) (AND (NEQ COPYRIGHTFLG (QUOTE NEVER)) (SAVECOPYRIGHT ROOTNAME)) (COND (NEWFILEMAP (PRIN1 (QUOTE "(DECLARE: DONTCOPY ")) (for ADR in MAPADR do (SETQ PRTTYTEM (GETFILEPTR PRTTYFILE)) (SETFILEPTR PRTTYFILE ADR) (PRIN2 PRTTYTEM) (SETFILEPTR PRTTYFILE PRTTYTEM)) (* This expresion writes the current file positon into the filecreated expression, and then restores the file pointer.) (PRIN2 (LIST (QUOTE FILEMAP) NEWFILEMAP)) (* printed instead of prettyprinted, so wont take up two pages of listing.) (PRIN1 (QUOTE ") ")) [PUTFILEMAP PRTTYFILE NEWFILEMAP (AND FILEDATES (LIST (LIST (fetch FILEDATE of (CAR FILEDATES)) (fetch DATEFILENAME of (CAR FILEDATES] (* Also stores MAP on property list, so can be used for subsequent makefiles.) )) (OUTPUT PRTYX) (* Output done before ENDFILE in case output was, in fact, PRTTYFILE before the call to PRETTYDEF, and PRTTYFILE is now being left closed) (COND ((AND (NULL PRTYOPENFLG) (NEQ PRTTYFILE T)) (ENDFILE PRTTYFILE))) (AND FILEDATES ROOTNAME (/replace FILEDATES of ROOTNAME with FILEDATES)) (RETURN PRTTYFILE]) (PRETTYDEF0 [LAMBDA (PRTTYFILE) (* Cleans up after prettydef in case of control-d.) (COND ((SETQ PRTTYFILE (OPENP PRTTYFILE (QUOTE OUTPUT))) (CLOSEF PRTTYFILE) (DELFILE PRTTYFILE]) (PRETTYDEF1 [LAMBDA NIL (* wt: " 9-SEP-78 16:05") (* Updates the DECLARE: for NLAMA/NLAML) (PROG (PRTTYCOM PRTTYTEM PRTTYNEW) (COND [[NULL (SOME PRETTYCOMSLST (FUNCTION (LAMBDA (X) (AND (EQ (CAR X) (QUOTE DECLARE:)) (SETQ PRTTYTEM (MEMB (QUOTE COMPILERVARS) (SETQ PRTTYCOM X))) (EQ (CAAR (SETQ PRTTYTEM (CDR PRTTYTEM))) (QUOTE ADDVARS] (AND (NULL NLAMALST) (NULL NLAMLST) (NULL LAMALST) (RETURN NIL)) (* If thee is no DECLARE: and no nlambdas, dont bother to add any. note tha if thee is IS a DECLARE:, then we must check even if there are no nlambdas, because consider what happens when user changes the only nlambda to a lambda - must replace the declare: by a nop addvars.) [SETQ PRTTYCOM (SUBPAIR (QUOTE (NLAMALST NLAMLST LAMALST)) (LIST NLAMALST NLAMLST LAMALST) (QUOTE (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA . NLAMALST) (NLAML . NLAMLST) (LAMA . LAMALST] (COND ((AND (LISTP PRETTYCOMSLST) (NLISTP PRTTYCOMS)) (/NCONC1 PRETTYCOMSLST PRTTYCOM) (PRETTYCOM PRTTYCOMS T] ([NOT (EQUAL (CAR PRTTYTEM) (SETQ PRTTYNEW (LIST (QUOTE ADDVARS) [CONS (QUOTE NLAMA) (UNION NLAMALST (INTERSECTION LAM?LST (CDADAR PRTTYTEM] [CONS (QUOTE NLAML) (UNION NLAMLST (INTERSECTION LAM?LST (CDR (CADDAR PRTTYTEM] (CONS (QUOTE LAMA) (UNION LAMALST (INTERSECTION LAM?LST (CDR (CADDDR (CAR PRTTYTEM] (* The reason for the unions and intersections is that prettydef simply may not know the fntyps of some of the functions in the file, namely those on lam?lst, and theefore tese should not be removed from NLAMA and NLAML if they are there from a previous makefile.) (/RPLACA PRTTYTEM PRTTYNEW) (AND (NLISTP PRTTYCOMS) (PRETTYCOM PRTTYCOMS T))) (T (RETURN NIL))) (PRETTYCOM PRTTYCOM) (RETURN T]) (PRINTDATE [LAMBDA (FILE CHANGES) (* rmk: "19-FEB-83 22:09") (* Returns new FILEDATES property, without installing it) (* assumes that FILE is the name of a file open for output, and prints the date information for that file on it) (PROG (PREVPAIR FILEDATES (DAT (DATE)) (ROOTNAME (ROOTFILENAME FILE))) (COND (FILEPKGFLG [AND ROOTNAME (/replace FILECHANGES of ROOTNAME with (SETQ CHANGES (FILEPKG.MERGECHANGES CHANGES (fetch FILECHANGES of ROOTNAME] (* The reason for the order of arguments in UNION is so that the changes will be listed in roughly the order made.) [SETQ FILEDATES (CONS (create FILEDATEPAIR FILEDATE ← DAT DATEFILENAME ← FILE) (SETQ PREVPAIR (LAST (fetch FILEDATES of ROOTNAME] (* Right now, FILEDATES simply keeps latest version and date, and original version and date. Latter for integrity checks on makefile remake, as described in filepackage. Note that don't want to change FILEDATES property until PRETTDEF completes. In case of control-d, the file will be deleted automatically.) )) (PRINTDATE1 FILE CHANGES DAT (fetch FILEDATE of (CAR PREVPAIR)) (fetch DATEFILENAME of (CAR PREVPAIR))) (* PRINTDATE1 does the actual printing. It is a separate function so that it can be advised.) (RETURN FILEDATES]) (PRINTDATE1 [LAMBDA (FILE CHANGES DAT PREVDATE PREVERS STR) (* rmk: "20-MAY-82 16:55") (* does the printing for PRINTDATE) (RESETLST (RESETSAVE (OUTPUT FILE)) (* note that CHANGEFONT checks for FONTCHANGEFLG explicitly so that it won't do anything if FONTCHANGEFLG is NIL) (printout NIL .FONT DEFAULTFONT "(FILECREATED " .P2 DAT , .FONT LAMBDAFONT .P2 FILE .FONT DEFAULTFONT) (COND ((AND BUILDMAPFLG FILE (NEQ FILE T)) (SETQ MAPADR (CONS (ADD1 (GETFILEPTR FILE)) MAPADR)) (PRIN3 " ") (* The address of where the map begins will be stored in this slot 8 spaces left because when radix is 8, can overflow seven spaces by a file of 300000 characters (Alice did it) The CONS is because of a feature no longer used where there could be two FILECREATED expressions at the head of a file font) )) [COND (FILEPKGFLG (COND (CHANGES (printout NIL T T 6 "changes to: " .PPVTL CHANGES))) (COND (PREVDATE (printout NIL T T 6 "previous date: " .P2 PREVDATE) (COND (PREVERS (printout NIL , .P2 PREVERS] (PRIN1 (OR STR (QUOTE ") "]) (PRINTFNS [LAMBDA (X PRETTYDEFLG) (* lmm "13-OCT-82 16:44") (* prettydeflg=T when called from prettydef.) (AND X (PROG (FNADRLST) [COND ((AND PRETTYDEFLG NEWFILEMAP) (SETQ FNADRLST (TCONC NIL (GETFILEPTR PRTTYFILE))) (TCONC FNADRLST NIL) (NCONC1 NEWFILEMAP (CAR FNADRLST] (PRIN1 (QUOTE %()) (PRINT (QUOTE DEFINEQ)) (PRETTYPRINT X (AND PRETTYDEFLG (OR FNADRLST T)) FNSLST) (* FNSLST bound in prettydef to list of functions on this file. used for font stuff.) (PRIN1 (QUOTE %))) (AND FNADRLST (RPLACA (CDAR FNADRLST) (GETFILEPTR PRTTYFILE))) (TERPRI]) (PRETTYCOM [LAMBDA (PRTTYCOM PRTTYFLG PRETTYCOMSTAIL) (* rrb "20-JUL-83 11:57") (PROG (PRTTYTEM) [COND ((NULL PRTTYCOM) (* So that RECOMPILE and BRECOMPILE do not have to check before calling PRETTYCOM.) (RETURN)) ((AND PRTTYFLG (NEQ PRTTYFILE T)) (PRINT (COND (LISPXPRINTFLG (* PRETTYCOMPRINT is an nlambda that does a lispxprint, except when prettyheader is NIL, in hich case it does nothing.) (LIST (QUOTE PRETTYCOMPRINT) PRTTYCOM)) (T (LIST (QUOTE PRINT) (LIST (QUOTE QUOTE) PRTTYCOM) T T] (COND ((LITATOM PRTTYCOM) (COND ((AND (NULL PRTTYFLG) (NOT (BOUNDP PRTTYCOM)) DWIMFLG (SETQ PRTTYTEM (FIXSPELL PRTTYCOM 70 USERWORDS T PRETTYCOMSTAIL (FUNCTION BOUNDP))) (SETQ PRTTYSPELLFLG T)) (SETQ PRTTYCOM PRTTYTEM))) (PRETTYVAR PRTTYCOM PRTTYFLG) (* FNS and VARS are printed as (RPAQQ atom value T) so that LOAD ALLPROP will still stre them in the value cell.) (RETURN PRTTYCOM)) (PRTTYFLG (* PRETTYDEF called with a list for FNS or VARS,) (RETURN PRTTYCOM))) TOP [COND ([AND (NULL ORIGFLG) (SETQ PRTTYTEM (fetch (FILEPKGCOM MACRO) of (CAR PRTTYCOM] (for X on (SUBPAIR (CAR PRTTYTEM) (PRETTYCOM1 PRTTYCOM T) (CDR PRTTYTEM)) do (PRETTYCOM (CAR X) NIL X))) (T (SELECTQ (CAR PRTTYCOM) (FNS (PROG (PRTTYSPELLFLG) (PRINTFNS (PRETTYCOM1 PRTTYCOM T) T) (AND PRTTYSPELLFLG (EQ (CADR PRTTYCOM) (QUOTE *)) (ATOM (SETQ PRTTYTEM (CADDR PRTTYCOM))) (PRETTYCOM PRTTYTEM)) (* The FNSlst had an error in it that was corrected.) )) ((VARS ARRAY) (for X in (PRETTYCOM1 PRTTYCOM T) do (PRETTYVAR X))) (DECLARE: (* Normally, expressions appearing in a symbolic file are (1) evaluated upon loading the file, (2) not evaluated when compiling the file, and (3) copied to the compile file. DECLARE: can be used to change state around any PRETTYCOM. The atomic symbols DONTCOPY, DOCOPY, DONTEVAL@COMPILE, DOEVAL@COMPILE, DONTEVAL@LOAD, and DOEVAL@LOAD have the obvious meaning. DECLARE: eliminates the pretty commands DECLARE, COMPROP, COMPROP*, PD, PC, and PC*. DECLARE: is defined as a functionthat evaluates all list expressions except when under a DONTEVAL@LOAD state.) (PRIN1 (QUOTE "(DECLARE: ")) (for LST on (PRETTYCOM1 PRTTYCOM T) do (COND ((ATOM (CAR LST)) [COND ((NOT (MEMB (CAR LST) DECLARETAGSLST)) (COND ((AND DWIMFLG (FIXSPELL (CAR LST) 70 DECLARETAGSLST T LST)) (SETQ PRTTYSPELLFLG T)) (T (GO ERROR] (PRIN1 (CAR LST)) (SPACES 1)) (T (TERPRI) (PRETTYCOM (CAR LST) NIL LST))) (SELECTQ (CAR LST) [(EVAL@LOADWHEN EVAL@COMPILEWHEN COPYWHEN) (COND ((SETQ LST (CDR LST)) (PRINTDEF (CAR LST)) (SPACES 1] NIL)) (PRIN1 (QUOTE ") "))) ((SPECVARS LOCALVARS GLOBALVARS) (SETQ PRTTYTEM (CONS (CAR PRTTYCOM) (PRETTYCOM1 PRTTYCOM T))) (PRIN1 "(DECLARE: DOEVAL@COMPILE DONTCOPY ") (PRINTDEF1 (COND ((EQ (CAR PRTTYCOM) (QUOTE GLOBALVARS)) (CONS (QUOTE ADDTOVAR) PRTTYTEM)) (T PRTTYTEM))) (PRIN1 ") ")) [(PROP IFPROP) (PROG ((PRTTYFLG (EQ (CAR PRTTYCOM) (QUOTE IFPROP))) (PRTTYTEM (CADR PRTTYCOM)) (PRTTYX (PRETTYCOM1 (CDR PRTTYCOM) T))) (* IFPROP only dumps those property values that are non-NIL.) (COND ((LISTP PRTTYTEM) (for X in PRTTYTEM do (MAKEDEFLIST PRTTYX X PRTTYFLG))) ((NEQ PRTTYTEM (QUOTE ALL)) (MAKEDEFLIST PRTTYX PRTTYTEM PRTTYFLG PRTTYCOM)) [(ASSOC (QUOTE PUTPROPS) PRETTYPRINTMACROS) (for ATM in PRTTYX do (PRINTDEF1 (CONS (QUOTE PUTPROPS) (CONS ATM (CONS (for X on (GETPROPLIST ATM) by (CDDR X) unless (MEMB (CAR X) SYSPROPS) join (LIST (CAR X) (CADR X] (T (for ATM in PRTTYX do (printout NIL " (PUTPROPS " .P2 ATM) (SETQ PRTTYTEM (ADD1 (POSITION))) (for X on (GETPROPLIST ATM) by (CDDR X) unless (MEMB (CAR X) SYSPROPS) do (printout NIL .TAB PRTTYTEM .PPV (CAR X) , .PPV (CADR X))) (PRIN1 (QUOTE ") "] (P (for X in (SETQ PRTTYTEM (PRETTYCOM1 PRTTYCOM T)) do (PRINTDEF1 X))) [INITVARS (for X in (PRETTYCOM1 PRTTYCOM T) do (COND ((LISTP X) (PRETTYVAR1 (QUOTE RPAQ?) (CAR X) (CDR X) NIL T)) (T (PRETTYVAR1 (QUOTE RPAQ?) X NIL] (ADDVARS (for X in (PRETTYCOM1 PRTTYCOM T) do (PRETTYVAR1 (QUOTE ADDTOVAR) [CAR (OR (LISTP X) (ERRORX (LIST 4 X] (CDR X) NIL T))) (APPENDVARS (for X in (PRETTYCOM1 PRTTYCOM T) do (PRETTYVAR1 (QUOTE APPENDTOVAR) [CAR (OR (LISTP X) (ERRORX (LIST 4 X] (CDR X) NIL T))) (E (for X in (PRETTYCOM1 PRTTYCOM T) do (EVAL X))) [COMS (SETQ PRTTYTEM (PRETTYCOM1 PRTTYCOM T)) (PROG ((PRETTYCOMSLST (APPEND PRTTYTEM PRETTYCOMSLST))) (for X on PRTTYTEM do (PRETTYCOM (CAR X) NIL X] [ORIGINAL (SETQ PRTTYTEM (PRETTYCOM1 PRTTYCOM T)) (PROG ((PRETTYCOMSLST (APPEND PRTTYTEM PRETTYCOMSLST)) (ORIGFLG T)) (for X on PRTTYTEM do (PRETTYCOM (CAR X) NIL X] [(ADVISE ADVICE) (MAKEDEFLIST (SETQ PRTTYTEM (PRETTYCOM1 PRTTYCOM T)) (QUOTE ARGNAMES) T) (ADVISEDUMP PRTTYTEM (EQ (CAR PRTTYCOM) (QUOTE ADVISE] (BLOCKS (SETQ PRTTYTEM (PRETTYCOM1 PRTTYCOM T)) (PRIN1 (QUOTE "[DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY ")) (for X in PRTTYTEM do (PRINTDEF1 (CONS (QUOTE BLOCK:) X))) (PRIN1 (QUOTE "] "))) (* [COND ((EQ (CADR PRTTYCOM) (QUOTE *)) (* Form-feed if super-comment indicated. Use * no matter what current COMMENTFLG is.) (printout NIL .PAGE)) (T (RPTQ 3 (TERPRI] (COND ((AND [COND (FILEFLG FONTCHANGEFLG) (T (EQ FONTCHANGEFLG (QUOTE ALL] LAMBDAFONT) (CHANGEFONT LAMBDAFONT) (RESETFORM (LINELENGTH LAMBDAFONTLINELENGTH) (PRIN2 PRTTYCOM)) (CHANGEFONT DEFAULTFONT)) (T (PRIN2 PRTTYCOM))) (RPTQ 2 (TERPRI))) (COND ([SETQ PRTTYTEM (ASSOC (CAR PRTTYCOM) (QUOTE ((COMPROP PROP DOEVAL@COMPILE) (COMPROP* PROP DOEVAL@COMPILE DONTCOPY) (DECLARE P DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY) (PD P DOEVAL@COMPILE) (PC P DOEVAL@COMPILE) (PC* P DOEVAL@COMPILE DONTCOPY] [SETQ PRTTYTEM (CONS (QUOTE DECLARE:) (APPEND (CDDR PRTTYTEM) (LIST (CONS (CADR PRTTYTEM) (CDR PRTTYCOM] (AND (EQ PRTTYCOM (CAR PRETTYCOMSTAIL)) (/RPLACA PRETTYCOMSTAIL PRTTYTEM) (SETQ PRTTYSPELLFLG T)) (PRETTYCOM PRTTYTEM)) ((AND (LITATOM (CAR PRTTYCOM)) (fetch (FILEPKGTYPE GETDEF) of (CAR PRTTYCOM))) (* If its the name of a type with a GETDEF, put out PUTDEF expressions.) (for X in (PRETTYCOM1 PRTTYCOM T) do (printout NIL "(PUTDEF " .P2 (KWOTE X) , .P2 (KWOTE (CAR PRTTYCOM)) , .PPV (KWOTE (GETDEF X (CAR PRTTYCOM))) ")" T))) ((FIXSPELL (CAR PRTTYCOM) 70 FILEPKGCOMSPLST T PRTTYCOM) (SETQ PRTTYSPELLFLG T) (GO TOP)) (T (GO ERROR] (RETURN PRTTYCOM) ERROR (ERROR "bad file package command" PRTTYCOM T]) (PRETTYCOMPRINT [NLAMBDA (X) (AND PRETTYHEADER (LISPXPRINT X T T]) (PRETTYVAR [LAMBDA (VAR FLG) (* rmk: "23-NOV-81 15:06") (* I don't see what FLG is used for--rmk) (PROG (VAL TEM) (* Dumps value of VAR for reloading. If VAR is non-atomic, of form (var form) where VAR is to be dumped so as to be set to value of form, computed at LOAD time.) (COND ((LITATOM VAR) (AND (EQ (SETQ VAL (GETTOPVAL VAR)) (QUOTE NOBIND)) (printout T T "****WARNING: " .P2 VAR " is unbound" T T)) (PRETTYVAR1 (QUOTE RPAQQ) VAR VAL)) [(LISTP VAR) (SETQ VAL (CDR VAR)) (SETQ VAR (CAR VAR)) (COND ((AND (EQ [CAR (SETQ TEM (LISTP (CAR (LISTP VAL] (QUOTE QUOTE)) (LISTP (CDR TEM))) (PRETTYVAR1 (QUOTE RPAQQ) VAR (CADR TEM))) ([OR (NULL VAL) (AND (LISTP VAL) (OR (NUMBERP (CAR VAL)) (EQ T (CAR VAL)) (NULL (CAR VAL))) (NULL (CDR VAL] (* A minor optimization for RPAQQ's to suppresses unnecessary load-time eval's.) (PRETTYVAR1 (QUOTE RPAQQ) VAR (CAR VAL))) (T (PRETTYVAR1 (QUOTE RPAQ) VAR VAL NIL T] (T (ERROR "Bad variable specification" VAR]) (PRETTYVAR1 [LAMBDA (OP VAR E DEF TAILFLG) (* rrb "20-JUL-83 11:51") (* does printing for VAR, ADDVAR, and PROP commands. OP is the name of the function, VAR the operand, and E the rest of the expression to be printed, either as an element, or as a tail if TAILFLG=T. VAR is printed in LAMBDAFONT. If VAR is a list, each element is printed in LAMBDAFONT. This option is used to print both the name of the atm and it s property for PROP commands.) (PROG (TEM (LASTCOL (LINELENGTH))) (TERPRI) (* because if you have a really bold font, it lines up the bottoms, but you can get crowded into the line above.) [COND ([AND (MEMB OP (QUOTE (RPAQQ RPAQ RPAQ?))) (MEMB [TYPENAME (SETQ TEM (COND (TAILFLG (CAR E)) (T E] (QUOTE (ARRAYP BITMAP] (COND ((EQ OP (QUOTE RPAQQ)) (SETQQ OP RPAQ))) (printout NIL "(" .P2 OP , .P2 VAR ,) (SELECTQ (TYPENAME TEM) (ARRAYP (printout NIL "(READARRAY " (ARRAYSIZE TEM) , "(QUOTE " (ARRAYTYP TEM) ") " (ARRAYORIG TEM) "))" T) (PRINTARRAY TEM)) (BITMAP (printout NIL "(READBITMAP))" T) (PRINTBITMAP TEM)) (SHOULDNT))) ((ASSOC OP PRETTYPRINTMACROS) (OR TAILFLG (SETQ E (CONS E))) (PRINTDEF [CONS OP (COND ((LISTP VAR) (APPEND VAR E)) (T (CONS VAR E] 0 DEF)) (T (PRIN1 (QUOTE %()) (PRIN1 OP) (SPACES 1) (SETQ TEM (POSITION)) (COND ((AND FONTCHANGEFLG PRETTYCOMFONT) (CHANGEFONT PRETTYCOMFONT))) (COND ((LISTP VAR) (MAPRINT VAR NIL NIL NIL NIL (FUNCTION PRIN2))) (T (PRIN2 VAR))) (COND ((AND FONTCHANGEFLG PRETTYCOMFONT) (CHANGEFONT DEFAULTFONT))) (SPACES 1) (PRINTDEF E (COND ((OR (NLISTP E) (FITP E NIL NIL LASTCOL)) (POSITION)) (T TEM)) DEF TAILFLG) (PRIN1 (QUOTE %)] (TERPRI]) (PRETTYCOM1 [LAMBDA (PRTYCOM PRTYFLG) (* rmk: "23-NOV-81 15:02") (RESETVARS ((NORMALCOMMENTSFLG (QUOTE DONTUPDATE))) (RETURN (PROG (PRTYX) (RETURN (COND [(AND (EQ [CAR (LISTP (SETQ PRTYX (CDR PRTYCOM] (QUOTE *)) (CDR PRTYX)) (COND ([AND (ATOM (SETQ PRTYX (CADR PRTYX))) PRTYFLG (NOT (MEMB PRTYX PRETTYCOMSLST)) (NULL (SOME PRETTYCOMSLST (FUNCTION (LAMBDA (COM) (AND (EQ (CAR COM) (QUOTE VARS)) (NEQ COM PRTYCOM) (OR (MEMB PRTYX COM) (ASSOC PRTYX COM] (* Checks to see if the variable is already being dumped and dumps it if not.) (PRETTYCOM PRTYX))) (COND (PRTYFLG (EVAL PRTYX)) ((LITATOM PRTYX) (AND (NEQ (SETQ PRTYX (GETTOPVAL PRTYX)) (QUOTE NOBIND)) PRTYX)) (T (RESETVARS (DWIMLOADFNSFLG) (RETURN (AND (NLSETQ (SETQ PRTYX (EVAL PRTYX))) PRTYX] (T PRTYX]) (ENDFILE [LAMBDA (FILE) (* wt: "10-SEP-78 13:54") (PRINT (QUOTE STOP) FILE) (CLOSEF FILE]) (MAKEDEFLIST [LAMBDA (X PROP FLG) (* rmk: "19-FEB-83 22:17") (PROG (TEM) (for Z in X do (COND [[AND (LITATOM Z) (SETQ TEM (SOME (GETPROPLIST Z) (FUNCTION [LAMBDA (X) (EQ X PROP]) (QUOTE CDDR] (PRETTYVAR1 (QUOTE PUTPROPS) (LIST Z PROP) (CADR TEM) (MEMB PROP (QUOTE (MACRO EXPR] ((NULL FLG) (* PROP command) (PRINT (LIST (QUOTE no) PROP (QUOTE property) (QUOTE for) Z) T]) (PP [NLAMBDA X (* rmk: " 4-NOV-81 13:25") (DECLARE (LOCALVARS . T)) (RESETLST (RESETSAVE (OUTPUT T)) (RESETSAVE (SETREADTABLE T)) (COND [(ATOM X) (CAR (PRETTYPRINT (LIST X] (T (PRETTYPRINT X]) (PP* [NLAMBDA X (* rmk: " 4-NOV-81 13:25") (DECLARE (LOCALVARS . T)) (RESETLST (RESETSAVE (OUTPUT T)) (RESETSAVE (SETREADTABLE T)) (RESETVARS (**COMMENT**FLG) (RETURN (COND [(ATOM X) (CAR (PRETTYPRINT (LIST X] (T (PRETTYPRINT X]) (PPT [NLAMBDA X (* wt: 13-SEP-77 8 53) (DECLARE (LOCALVARS . T)) (RESETLST (RESETSAVE (OUTPUT T)) (RESETSAVE (SETREADTABLE T)) (RESETVARS ((PRETTYTRANFLG T)) (RETURN (COND [(ATOM X) (CAR (PRETTYPRINT (LIST X] (T (PRETTYPRINT X]) (PRETTYPRINT [LAMBDA (FNS PRETTYDEFLG FNSLST) (* rmk: "23-NOV-81 14:56") (* PRETTYDEFLG is supplied when called from PRINTFNS. it is either a paatial file map or T, so that it is also used as a flag for whether you are being called from prettydef.) (* Note that prettyprint does all of its printing to standard output file and using current readtable. it assumes that higher functions have set these appropriately, as is the case when called from prettydef, pp, pp*,) (PROG [LST (CLK (CLOCK 0)) TEM FN DEF ADR (NEWADRLST (LISTP PRETTYDEFLG)) SKIPPEDLST (FILEFLG (NOT (DISPLAYP (OUTPUT] (* NEWADRLST Corresponds to the current entry on NEWFILEMAP. Is in TCONC format.) [COND ((ATOM (SETQ LST FNS)) (SETQ LST (EVALV FNS] LP (COND ((NLISTP LST) (RETURN FNS)) ((AND FILEFLG (IGREATERP (IDIFFERENCE (SETQ TEM (CLOCK 0)) CLK) 30000)) (SETQ CLK TEM) (PRIN2 (CAR LST) T T) (PRIN1 (QUOTE ", ") T))) (SETQ FN (CAR LST)) (TERPRI) (* The initial TERPRI is not in map) [AND NEWADRLST (TCONC NEWADRLST (LIST FN (GETFILEPTR PRTTYFILE] (* Address of start.) LP1 (SETQ DEF (VIRGINFN FN)) (AND PRETTYDEFLG (SELECTQ (ARGTYPE DEF) (1 (SETQ NLAMLST (CONS FN NLAMLST))) (2 (SETQ LAMALST (CONS FN LAMALST))) (3 (SETQ NLAMALST (CONS FN NLAMALST))) (NIL (SETQ LAM?LST (CONS FN LAM?LST))) NIL)) (* So prettydef can add the appropriate DECLARE:) [COND [(NULL DEF) (COND ((AND (NULL PRETTYDEFLG) FN (BOUNDP FN)) (* i.e. only make this check when called via PP or PP*) (PRINTDEF (EVALV FN) 2)) (T (GO NOPRINT] ((NULL (EXPRP DEF)) (GO NOPRINT)) (T (AND ADDSPELLFLG (ADDSPELL FN)) (COND ((AND PRETTYDEFLG SOURCEFILE [NULL (SELECTQ REPRINTFNS (ALL T) ((T EXPRS) (EXPRP FN)) (AND (LISTP REPRINTFNS) (FMEMB FN REPRINTFNS] (PRETTYPRINT1 FN)) (* See comment in PRETTYDEF.) (GO DEFPRINTED))) [AND (OR (SELECTQ CLISPIFYPRETTYFLG ((T EXPRS) (EXPRP FN)) (ALL T) (CHANGES (AND PRETTYDEFLG (MEMB FN CHANGES))) (MEMB FN CLISPIFYPRETTYFLG)) (AND (SUPERPRINTEQ (CAR (SETQ TEM (CADDR DEF))) COMMENTFLG) (EQ (CADR TEM) (QUOTE DECLARATIONS:)) (MEMB (QUOTE CLISPIFY) TEM))) (RESETVARS (FILEPKGFLG) (SETQ DEF (CLISPIFY DEF] (* If the function is stored on property list, only clispify if user specifically said MAKEFILE (file CLISPIFY), otherwise, assume that functions on property list have already been clispified) (COND ((AND LAMBDAFONT FONTCHANGEFLG) (PRIN1 (QUOTE %()) (* The font change is after the paren because of problems with updating filemaps when moving back and forth between -10 and -D systems--rmk) (CHANGEFONT LAMBDAFONT) (PRIN2 FN) (CHANGEFONT DEFAULTFONT) (TERPRI)) (T (PRIN1 (QUOTE %()) (PRINT FN))) (PRINTDEF DEF 2 (QUOTE FNS) NIL FNSLST) (PRIN1 (QUOTE %)] DEFPRINTED (AND NEWADRLST (RPLACD (CDADR NEWADRLST) (GETFILEPTR PRTTYFILE))) (* Store end address) (TERPRI) (* TERPRI is not included in map address) (SETQ LST (CDR LST)) (GO LP) NOPRINT (COND ((AND FILEFLG SOURCEFILE (PRETTYPRINT1 FN)) (GO DEFPRINTED)) ((AND (NULL PRETTYDEFLG) (SETQ TEM (EDITLOADFNS? FN))) (* only make this check when called from PP or PP*) (LOADFNS FN TEM (QUOTE PROP)) (COND ((GETPROP FN (QUOTE EXPR)) (GO LP1))) (PRINT (CONS FN (QUOTE (not found))) T T)) ((AND DWIMFLG (NULL DEF) (SETQ TEM (MISSPELLED? FN 70 USERWORDS (AND PRETTYDEFLG T) LST)) (NEQ TEM FN)) (/RPLACA LST (SETQ FN TEM)) (AND NEWADRLST (FRPLACA (CADR NEWADRLST) FN)) (* Fixes filemap.) (AND PRETTYDEFLG (SETQ PRTTYSPELLFLG T)) (GO LP1))) (LISPXPRINT (CONS FN (QUOTE (not printable))) T) (AND LISPXHISTORY (LISPXPUT (QUOTE *ERROR*) FN NIL (CAAR LISPXHISTORY))) (COND (NEWADRLST (SETQ TEM (NLEFT (CAR NEWADRLST) 2)) (RPLACD TEM) (RPLACD NEWADRLST TEM))) LP3 (SETQ LST (CDR LST)) (GO LP]) (PRETTYPRINT1 [LAMBDA (FN) (* rmk: " 5-MAY-81 15:24") (* Like BRECOMPILE1. Obtains FN from SOURCEFILE. works whether the file has previously been mapped by PRETTYDEF, LOAD, or LOADFNS (or patially mapped)) (PROG (ADR TEM) (COND ((NULL OLDFILEMAP) (GO DEFQLP)) ((PRETTYPRINT2 FN) (RETURN FN)) ((NULL (CAR OLDFILEMAP)) (RETURN NIL) (* The entire file has been scanned.) ) (T (GO FNLP) (* Already inside of DEFINEQ.) )) DEFQLP (* Find DEFINEQ) (SELECTQ (SETQ TEM (RATOM SOURCEFILE)) ((STOP NIL) (* End of file reached.) (SETQ OLDFILEMAP (CONS NIL OLDFILEMAP)) (* Just to inform future calls to PRETTYPRINT1 not to bother scanning.) (RETURN NIL)) [%( (COND ((EQ (SETQ TEM (RATOM SOURCEFILE)) (QUOTE DEFINEQ)) (COND ((NULL OLDFILEMAP) (SETQ OLDFILEMAP (LIST T)) (* In case functionis found right off, OLDFILEMAP must not be left as NIL or else next call to PRETTYPRINT1 will not realize are alredy inside of DEFINEQ.) )) (GO FNLP)) (T (SKREAD SOURCEFILE (QUOTE %(] (SKREAD SOURCEFILE TEM)) (GO DEFQLP) FNLP(SELECTQ (SETQ TEM (RATOM SOURCEFILE)) (%) (* End of DEFINEQ.) (GO DEFQLP)) ((%( %[) NIL) (SCANFILEHELP)) (SETQ ADR (SUB1 (GETFILEPTR SOURCEFILE))) (SETQ TEM (RATOM SOURCEFILE)) (SETFILEPTR SOURCEFILE ADR) (SKREAD SOURCEFILE) (COND ((EQ TEM FN) (PRETTYPRINT2 FN ADR (GETFILEPTR SOURCEFILE)) (* copies the bytes.) (RETURN FN)) (T (SETQ OLDFILEMAP (CONS (CONS TEM (CONS ADR (GETFILEPTR SOURCEFILE))) OLDFILEMAP)) (* Note that this situation only occurs when (a) the entire file was not peviously scanned, e.g. if loaded with buildmapflg off, and (b) user is doing a remake, and (c) this functio was either dumped directly because it was changed, or else it has been deleted from the FNS. The function is added to OLDFILEMAP just in case it is out of order.) (GO FNLP]) (PRETTYPRINT2 [LAMBDA (FN FROM TO) (* rmk: " 5-MAY-81 16:13") (* Copies function from sourcefile to prettyfile. looking it up on the map when not already given address. returns nil if not there) (PROG (TEM) (COND (FROM) ([SOME OLDFILEMAP (FUNCTION (LAMBDA (X) (COND ((NLISTP X) NIL) ((EQ (CAR X) FN) (* occurs when remaking a file without a map, and a function is previously skipped that later is needed.) (SETQ TEM X)) ((LISTP (CDDR X)) (SETQ TEM (FASSOC FN (CDDR X] (SETQ FROM (CADR TEM)) (SETQ TO (CDDR TEM))) (T (RETURN NIL))) (SETFILEPTR SOURCEFILE FROM) (RATOM SOURCEFILE) (* The RATOM skips the paren. the reason for the raom instead of simply doing an sfptr (ADD1 FROM) is that there may be font info there.) (COND ((NEQ FN (SETQ TEM (READ SOURCEFILE))) (* Consistency check.) (LISPXPRINT (CONS FN TEM) T) (ERROR (QUOTE "filemap does not agree with contents of") SOURCEFILE T))) (COPYBYTES SOURCEFILE PRTTYFILE FROM TO) (* Initial and final TERPRI's are done by callers; they are not in map.) (RETURN FN]) (PRINTDEF1 [LAMBDA (EXPR) (PRINTDEF EXPR) (TERPRI]) (PRINTDEF [LAMBDA (EXPR LEFT DEF TAILFLG FNSLST FILE) (* rmk: " 8-AUG-82 22:28") (RESETLST (* RESETLST is here so stuff under here can save things, e.g. change RADIX or prettyprint parameters) (AND FILE (RESETSAVE (OUTPUT FILE))) (AND LEFT (NOT (NUMBERP LEFT)) (SETQ LEFT (POSITION))) (RESETVARS ((FONTCHANGEFLG FONTCHANGEFLG) (COMMENTLINELENGTH COMMENTLINELENGTH) (FIRSTCOL FIRSTCOL)) (RETURN (PROG [(I (OR LEFT 0)) (LASTCOL (LINELENGTH)) (FORMFLG DEF) HELPCLOCK (CRCNT 0) CHANGEFLG (FILEFLG (NOT (DISPLAYP (OUTPUT] (SETQ FONTCHANGEFLG (COND ((OR FILEFLG (EQ FONTCHANGEFLG (QUOTE ALL))) (* if FILEFLG is NIL and fontchangeflg is T, this resets it to NIL.) FONTCHANGEFLG))) (COMPUTEPRETTYPARMS) (* adjust anything the font people care about) (SETQ CHANGEFLG0 NIL) (AND FONTCHANGEFLG (CHANGFONT DEFAULTFONT)) (COND [(NULL PRETTYFLG) (COND (TAILFLG (MAPRINT EXPR NIL NIL NIL NIL (FUNCTION PRIN2))) (T (PRIN2 EXPR] (T (TAB I T) (COND (TAILFLG (SUBPRINT EXPR)) (T (SUPERPRINT EXPR]) (SUPERPRINT [LAMBDA (E BRFLG) (* wt: "25-FEB-80 19:10") (COND [(AND (LISTP E) CHANGESARRAY (GETHASH E CHANGESARRAY)) (PROG ((CHANGEFLG CHANGEFLG) TEM) (COND ((AND (OR FILEFLG DISPLAYTERMFLG) (NULL CHANGEFLG) CHANGECHAR) (* Causes ENDLINE to print CHANGECHAR in right margin. The reason for the two flags is that the endline may occur outside of the scope of CHANGEFLG, and yet there needs to be a flag true for all of E because subepxressions may not and usually are not also marked as changed. Thus ENDLINE prints changechar whenever either CHANGEFLG or CHANGEFLG0 is T, and in addition, if CHANGEFLG is T, it resets CHANGEFLG0 to T (for the next time)) (SETQ CHANGEFLG0 T) (SETQ CHANGEFLG T))) (AND FONTCHANGEFLG CHANGEFONT (SETQ TEM (CHANGFONT CHANGEFONT))) (* print E in different font) (RETURN (PROG1 (SUPERPRINT0 E BRFLG) (AND TEM (CHANGFONT TEM] (T (SUPERPRINT0 E BRFLG]) (SUPERPRINT0 [LAMBDA (E BRFLG) (* wt: " 4-JUL-80 21:36") (* BRFLG says do not print a %), expression will be terminated by a %]. Value is T if a carraiger return was printed, NIL otherwise.) (PROG (TEM1 TEM2 (TYP (TYPENAME E))) [COND ((AND CLISPTRANFLG (NULL PRETTYTRANFLG) (EQ TYP (QUOTE LISTP)) (EQ (CAR E) CLISPTRANFLG)) (* PRETTYTRANFLG=NIL means print the CLISP. Done here instead of inside LAMBDA below because CDDR E might be an atom.) (SETQ E (CDDR E)) (SETQ TYP (TYPENAME E] MACROLP [COND ((AND (EQ TYP (QUOTE LISTP)) (SETQ TEM1 (FASSOC (CAR E) PRETTYPRINTMACROS))) (* Gives user a hook in which to format selected expressions himself. he can either do the printing himself, or return the expression to be prited. e.g. CLISP% things could have been handled this way. or printing comments on the teletype could also have been handled this way.) (COND ((NULL (SETQ TEM1 (APPLY* (CDR TEM1) E))) (RETURN E)) ((PROG1 (NEQ E TEM1) (SETQ E TEM1) (SETQ TYP (TYPENAME E))) (GO MACROLP] [COND ([AND (NEQ TYP (QUOTE LISTP)) [NOT (IGREATERP I (SETQ TEM1 (POSITION] (IGREATERP (ADD1 TEM1) (SETQ TEM2 (IDIFFERENCE LASTCOL (NCHARS E T] (* TEM2 is the first column at which the ATOM will fit on a line.) (ENDLINE (COND ((IGREATERP (SETQ TEM2 (IPLUS TEM2 -5)) I) (* This is (MIN P-5 I)) I) (T TEM2] (COND [(EQ TYP (QUOTE LISTP)) (PROG [(I (IPLUS I (COND ((NLISTP (CAR E)) 2) ((NULL DEF) 1) ((OR (NULL FORMFLG) (SUPERPRINTEQ (CAAR E) (QUOTE LAMBDA))) (* In function definition, the sublists in a list of lists are aligned except for the indicatd cases.) 2) (T 1] [COND ((AND DEF FORMFLG (SUPERPRINTEQ (CAR E) COMMENTFLG)) (RETURN (COMMENT1 E T] (COND ((AND #RPARS (NULL BRFLG) (RPARS E)) (PRIN1 (QUOTE %[)) (SETQ BRFLG T) (SETQQ TEM1 %])) (T (PRIN1 (QUOTE %()) (SETQ TEM1 NIL))) [COND ([AND PRETTYTRANFLG (OR (AND CLISPARRAY [COND [(LITATOM (CAR E)) (NULL (FGETD (CAR E] ((LISTP (CAR E)) (NULL (OR (SUPERPRINTEQ (CAAR E) (QUOTE LAMBDA)) (SUPERPRINTEQ (CAAR E) (QUOTE NLAMBDA] (SETQ TEM2 (GETHASH E CLISPARRAY))) (AND CLISPTRANFLG (EQ (CAR E) CLISPTRANFLG) (SETQ TEM2 (CADR E)) (SETQ E (CDDR E] (* If (CAR E) is an atom, and it is the name of a function, a translation wouldnt be invoked, so dont bother to check for one.) (COND ((EQ PRETTYTRANFLG T) (* PRETTYTRANFLG=T means print the translation.) (SETQ E TEM2)) (T (* For other values, e.g. BOTH, an xpression of the form (CLISP% translation . expression) is printed, (even when the translation was originaly in the hash array). This saves both, and when reloaded, and dwiified or run, CLISP% rehashes and removes the CLISP% (assuming CLISPARRAY is set up that way)) (PRIN2 CLISPTRANFLG) (SUPERPRINT TEM2 BRFLG) (ENDLINE] (SUBPRINT E BRFLG) [COND ((NOT (ILESSP (POSITION) LASTCOL)) (PROG (TAIL) (* need to rebind tail, because if next expressionis a comment, dont want to print it now, because we still have the right paren to print.) (ENDLINE] (COND (TEM1 (PRIN1 TEM1)) ((NULL BRFLG) (PRIN1 (QUOTE %)] ([AND (NEQ TYP (QUOTE LITATOM)) (SETQ TEM1 (CDR (FASSOC TYP PRETTYPRINTYPEMACROS] (* Gives user a hook to specify how data types other than lists or atoms are to be printed.) (APPLY* TEM1 E)) (T (PRIN2 E))) (RETURN E]) (SUPERPRINTEQ [LAMBDA (X Y) (OR (EQ X Y) (AND Y (EQ (CDR (FASSOC X PRETTYEQUIVLST)) Y]) (SUPERPRINTGETPROP [LAMBDA (ATM PROP) (* wt: "17-SEP-79 15:57") (OR (GETPROP (CDR (FASSOC ATM PRETTYEQUIVLST)) PROP) (GETPROP ATM PROP]) (RPARS [LAMBDA (E) (SELECTQ (CAR E) ([LAMBDA NLAMBDA] T) (DEFINEQ (* Dont want square brakcets around DEFINEQ's expressions, because this means last function pair is special with respect to LOaDFNS.) NIL) (PROG ((N 1) (X E) Y (Z E)) LP (COND ([LISTP (SETQ X (CDR (SETQ Y X] (GO LP)) ((LISTP (SETQ X (CAR Y))) (ADD1VAR N) (SETQ Z X) (GO LP)) (T (RETURN (NOT (ILESSP N #RPARS]) (SUBPRINT [LAMBDA (TAIL BRFLG END) (* bvm: "26-OCT-82 15:56") (PROG (CURRENT DOCRFLG (TAIL0 TAIL) (I0 (POSITION)) NEXT TEM CRCNT0 CLISPWORD (FORMFLG0 FORMFLG) FORMFLG) LP (COND ((OR (NULL TAIL) (EQ TAIL END)) (RETURN TAIL)) ((NLISTP TAIL) (PRIN1 (QUOTE " . ")) (SUPERPRINT TAIL) (RETURN))) (SETQ CRCNT0 CRCNT) (SETQ CURRENT (CAR TAIL)) (AND CLISPFLG DEF FORMFLG0 (SETQ CLISPWORD (AND (SET ((OR (FMEMB CURRENT FNSLST) (FMEMB CURRENT (LISTP FONTFNS))) USERFONT) ((FGETD CURRENT) SYSTEMFONT))) ((AND (SUPERPRINTGETPROP CURRENT (QUOTE CLISPTYPE)) (NOT (FMEMB CURRENT CLISPCHARS))) (* Infix operators like GT, AND, etc.) CLISPFONT))) (SETQ TEM (CHANGFONT TEM))) (* When printing a function, via a caal to prettydef, and fontflg is turned on, and the function is either on FNS or on FONTFLG, do a fontchange.) (SETQ FORMFLG (COND [(SUPERPRINTEQ (CAR TAIL0) (QUOTE SELECTQ)) (OR (EQ CURRENT (CADR TAIL0)) (NULL (CDR TAIL] ((OR (SUPERPRINTEQ (CAR TAIL0) (QUOTE COND)) (SUPERPRINTEQ (CAR TAIL0) (QUOTE QUOTE))) NIL) (T T))) (* says whether next expression is to be treated as a form. used to be an argument to superprint, but this value of formflg shuld also affect the call to endline from subprint.) (SETQ CURRENT (SUPERPRINT CURRENT (AND (NULL (CDR TAIL)) BRFLG))) (* Reason for the SETQ is in case user prints a list as an atom via prtttyprintmacros, e.g. (QUOTE X) as 'X.) (SETQ TAIL (CDR TAIL)) (* the setq tail used to be in the call to superprint, i.e. buried in he AND. thi meant that if the call to endline in superprint thatoccurs before the expression is printed, i.e. cause wont fit, occurred, and the next thing was a comment, that the comment wold be (mistakenly) printed before this expression, via endline.) (AND TEM (CHANGFONT TEM)) (* CURRENT is always the element just printed, NEXT the one about to be printed, i.e. CAR of E.) (* BRFLG only affects last expression in list.) LP0 (COND ((EQ TAIL END) (RETURN TAIL)) ((NLISTP TAIL) (GO LP)) ((OR (NULL CLISPFLG) (NULL DEF) (NULL FORMFLG0)) (GO LP1)) [(NOT (LITATOM (SETQ NEXT (CAR TAIL] ([AND (SETQ TEM (SUPERPRINTGETPROP NEXT (QUOTE CLISPWORD))) (OR (NLISTP TEM) (EQ (CAR TEM) (CAR (SUPERPRINTGETPROP (CAR TAIL0) (QUOTE CLISPWORD] (* AND and OR are treated like prettywords because they are broadscope operators, i.e. they permit segments, and therefore the standard FITP test can't be ued.) (GO CLISPWORD)) ((EQ (CHCON1 NEXT) (CHARCODE <)) [COND [(EQ (SETQ TEM (SUBPRINT2 TAIL END)) (CDR TAIL)) (COND ((AND (LITATOM CURRENT) (STRPOS (QUOTE "←") CURRENT) (NEQ (NTHCHARCODE CURRENT -1) (CHARCODE ←))) (GO CR)) (T (GO LP1] ((OR (LISTP CURRENT) (AND (STRPOS (QUOTE "←") CURRENT) (NEQ (NTHCHARCODE CURRENT -1) (CHARCODE ←))) (NOT (FITP TAIL NIL TEM))) (ENDLINE)) (T (SPACES 1) (AND (EQ (CDR TAIL0) TAIL) (SETQ I (POSITION] (SETQ CRCNT0 CRCNT) (PROG (I) (SETQ I (IPLUS (POSITION) 2)) (SETQ TAIL (SUBPRINT TAIL BRFLG TEM))) (SETQQ CURRENT >) (GO LP0)) ([AND (EQ [CAR (LISTP (CDR (LISTP TAIL] (QUOTE ←)) (OR (SUPERPRINTEQ (CAR TAIL0) (QUOTE CREATE)) (SUPERPRINTEQ (CAR TAIL0) (QUOTE create] (GO CR))) (COND ((LISTP CURRENT) (AND (LITATOM NEXT) (NOT (BOUNDP NEXT)) (NOT (FMEMB NEXT FUNNYATOMLST)) (FMEMB (SETQ TEM (NTHCHAR NEXT 1)) CLISPCHARS) (NEQ TEM (QUOTE <)) (NOT (SUPERPRINTGETPROP TEM (QUOTE UNARYOP))) (GO LP)) (* E.g. ((FOO) *FIE)) ) ((NOT (LITATOM CURRENT)) (GO LP1)) ((OR (EQ (CAR CLISPWORD) (QUOTE IFWORD)) (EQ (CAR CLISPWORD) (QUOTE FORWORD))) (SETQ DOCRFLG NIL) (AND (NULL END) (SETQ END T)) (* See use of END at LP2 beloow) ) ((AND (LISTP NEXT) CLISPIFYPACKFLG [COND [(EQ (CDR TAIL0) TAIL) (AND (NULL (FGETD CURRENT)) (NULL (SUPERPRINTGETPROP CURRENT (QUOTE EXPR] (T (NOT (BOUNDP CURRENT] (NOT (FMEMB CURRENT FUNNYATOMLST)) (FMEMB (SETQ TEM (NTHCHAR CURRENT -1)) CLISPCHARS) (NEQ TEM (QUOTE >)) (NOT (FASSOC (CAR NEXT) PRETTYPRINTMACROS))) (* E.g. X* (FOO): Don't space unless CLISPIFYPACKFLG is NIL or FOO has a macro (which might make it turn into a non-list)) (GO LP)) ((AND (STRPOS (QUOTE "←") CURRENT) (NEQ (NTHCHARCODE CURRENT -1) (CHARCODE ←))) (* E.G. IF -- THEN FOO←X FIE←Y is more readable if the assignments are on separate lines.) (GO CR))) LP1 [COND ((EQ (CDR TAIL0) TAIL) (* First time through, i.e. just superprinted HEAD of list.) (AND DEF FORMFLG0 (SELECTQ (OR (CDR (FASSOC CURRENT PRETTYEQUIVLST)) CURRENT) (COND (GO CR)) ((PROG RESETVARS) (PRINTPROG TAIL BRFLG) (RETURN)) ((ASSEMBLE ASSEM) (RESETFORM (RADIX 8) (PRINTPROG TAIL BRFLG)) (RETURN)) (SELECTQ (SETQ DOCRFLG T) (* To insure carriage return after select-expression) ) ((SETQ RESETVAR) (GO SP)) (FUNCTION (AND (NULL (CDR TAIL)) (GO SP)) (* Normally, I is not reset for FUNCTION, and the margin for the body of the lambda definition is directly under FUNCTION to conserve space. However, when FUNCTION is given a second argument, this would cause confusion, so I is reset in this case.) ) ([LAMBDA NLAMBDA] (SETQ DOCRFLG T) (SPACES 1) (GO LP)) NIL)) (COND ([OR (LISTP CURRENT) (NULL (FITP TAIL T (OR (LISTP END) (AND CLISPWORD (SUBPRINT1 TAIL (CAR CLISPWORD] (* Don't reset I.) (GO CR)) ((EQ (CHCON1 CURRENT) (CHARCODE <)) (GO SP)) (T (* Don't go to SP to space because don't want DOCRFLG changed, i.e. if U=SELECTQ, then DOCRFLG has been set to insure carriage return after selector.) (SPACES 1) (SETQ I (POSITION)) (GO LP] LP2 (AND (NEQ CRCNT0 CRCNT) (OR (NOT (ATOM CURRENT)) (EQ CURRENT (QUOTE >))) (GO CR)) (* Printing last "thing" (usually a list) caused a c.r. Also occurs if printing angle brackets which contain a list inside, e.g. < (FOO (FIE) X) > and c.r. will occur after >.) (* I disabled the listp check because henry wanted to be able to force a c.r. via a prettyprintype macro. if this doesnt work, rethink.) (SETQ NEXT (CAR TAIL)) (COND [(LISTP CURRENT) (COND ((OR (NULL END) (SUPERPRINTEQ (CAR CURRENT) COMMENTFLG)) (GO CR)) ((AND (LISTP NEXT) (SUPERPRINTEQ (CAR NEXT) COMMENTFLG)) (GO SP)) ([AND (LITATOM NEXT) (OR (SUPERPRINTGETPROP NEXT (QUOTE CLISPWORD)) (SUPERPRINTGETPROP NEXT (QUOTE CLISPTYPE] (GO SP)) (T (GO CR] ((NLISTP NEXT) (GO SP)) (DOCRFLG (* DOCRFLG is set to T whenever a carriage return is performed. It is reset to NIL whenever a carriage return is NOT performed, e.g. when two atoms are adjacent. while it is T, carriage returns are performed FOLLOWING all expressions. For example, in - (A B (C) D (E) F G (H)) (C) D (E) and F would be on separate lines, but F, G, and (H) would all be ont he same line.) (GO CR)) ((FITP NEXT) (GO SP)) (T (GO CR))) SP (SETQ DOCRFLG NIL) (SPACES 1) (GO LP) CR (SETQ DOCRFLG T) (ENDLINE) (GO LP) CLISPWORD (PROG ((I I) (I0 I0)) (SETQ TEM (SELECTQ (OR (CDR (FASSOC NEXT PRETTYEQUIVLST)) NEXT) ((THEN ELSE ELSEIF then else elseif) (* THEN, ELSE, and ELSEIF always start a new line.) [SETQ I (ADD1 (ENDLINE (IPLUS I0 (COND ((OR (EQ NEXT (QUOTE THEN)) (EQ NEXT (QUOTE then))) 3) (T 1] (* Note that in most cases, I will be reset again in subprint after printing the CLISPWORD. It will remain this value only if the nexxt expression wont fit.) (SETQ TAIL (SUBPRINT TAIL BRFLG (SUBPRINT1 (CDR TAIL) (QUOTE IFWORD) END))) (RETURN)) ((AND OR and or) (* So when new left margin is coputed in next cond, it will be based on inner expression.) (SETQ I0 I) (SUBPRINT1 (CDR TAIL) NIL END)) ((! !!) (CDDR TAIL)) (SUBPRINT1 (CDR TAIL) (CAR (GETP (CAR TAIL0) (QUOTE CLISPWORD))) END))) [SETQ I (ADD1 (COND ((OR (PROG1 (NEQ CRCNT0 CRCNT) (* Last expression involved a carriage return, so start on new line, e.g. for X in (FOO (FIE) (FUM)) do --) ) (PROG1 [AND [LISTP (CAR (LISTP (CDR TAIL] (for TL on (CDDR TAIL) until (EQ TL TEM) thereis (LISTP (CAR TL] (* There is more than one LISTP expression between here and next CLISPWORD, if any, so this segment will be on several lines. Break now to avoid having a large segment squashed up on the right) ) (PROG1 (NOT (FITP TAIL NIL TEM)) (* If the segment of the list between here and the next CLISPFORWORD will not fit, carriage return now.) )) (ENDLINE (IPLUS I0 2))) (T (SPACES 1) (POSITION] (SETQ CRCNT0 CRCNT) (SETQ CURRENT (CAR (NLEFT TAIL 1 TEM))) (SETQ TAIL (SUBPRINT TAIL BRFLG TEM))) (GO LP0) (* We are now in the position of just having printed the element bbefore E, and are ready to look ahead at the next one, so go to LP0.) ]) (SUBPRINT1 [LAMBDA ($TAIL X END) (* wt: "30-JUL-78 13:01") (* Searches E to END for an element that is a ember of L.) (PROG (TEM) LP (COND ((OR (EQ $TAIL END) (NLISTP $TAIL)) (RETURN $TAIL)) ((AND (LITATOM (CAR $TAIL)) (SETQ TEM (GETPROP (CAR $TAIL) (QUOTE CLISPWORD))) (OR (NULL X) (EQ (CAR TEM) X))) (RETURN $TAIL)) ((AND (EQ X (QUOTE RECORDWORD)) (EQ (CADR $TAIL) (QUOTE ←))) (RETURN $TAIL))) (SETQ $TAIL (CDR $TAIL)) (GO LP]) (SUBPRINT2 [LAMBDA ($TAIL END) (PROG ((N 0) L) LP (COND ((OR (EQ $TAIL END) (NLISTP $TAIL)) (RETURN $TAIL)) ((NOT (LITATOM (CAR $TAIL))) (SETQ $TAIL (CDR $TAIL)) (GO LP))) (SETQ L (DUNPACK (CAR $TAIL) CHCONLST)) (SETQ $TAIL (CDR $TAIL)) LP1 [COND ((NULL L) (COND ((ZEROP N) (RETURN $TAIL))) (GO LP)) ((EQ (CAR L) (QUOTE <)) (SETQ N (ADD1 N))) ((EQ (CAR L) (QUOTE >)) (SETQ N (SUB1 N] (SETQ L (CDR L)) (GO LP1]) (CHANGEFONT [LAMBDA (FONTCLASS FILE) (* rmk: " 8-AUG-82 22:25") (* for calls to changefont when not under prettyprin) (* Don't bother testing for FONTCHANGEFLG=ALL, because presumably the FONTCLASS will have a NULL entry if display printing isn't wanted. FONTCHANGEFLG=ALL tests are really only needed if something expensive can be avoided by advance knowledge.) (AND FONTCHANGEFLG (PROG [(FILEFLG (NOT (DISPLAYP FILE] (RETURN (CHANGFONT FONTCLASS FILE]) (CHANGFONT [LAMBDA (FONTCLASS FILE) (* rmk: " 8-AUG-82 22:26") (* This is less general than the FONTSETUP interface, since we only know about symbolic files and displays.) (PROG (FSPEC) (COND ((EQ FONTCLASS LASTFONT) (RETURN LASTFONT)) [(LISTP FONTCLASS) (COND (FILEFLG (AND [OR (NULL (SETQ FSPEC (CAR FONTCLASS))) (EQ FSPEC (CAR (LISTP LASTFONT] (RETURN LASTFONT)) (* NULL check cause font may not exist for all devices) (PRIN3 FSPEC FILE)) (T (AND [OR (NULL (SETQ FSPEC (CADR FONTCLASS))) (EQ FSPEC (CADR (LISTP LASTFONT] (RETURN LASTFONT)) (* We require all display-changing implementations to provide DSPFONT and OUTPUTDSP functions) (DSPFONT FSPEC (OUTPUTDSP FILE] (T (ERROR "undefined font" FONTCLASS))) (RETURN (PROG1 LASTFONT (SETQ LASTFONT FONTCLASS]) (PRINTPROG [LAMBDA (TAIL BRFLG) (* rmk: "23-MAY-82 23:56") (PROG (V (I (IPLUS (POSITION) -3)) CLISPTEM (FORMFLG T)) (* Resets I to column corresponding to to the 'R' in 'PROG'. This is the column PROG labels start in.) (SPACES 1) (PROG ((I (IPLUS I 4))) (SUPERPRINT (CAR TAIL) (AND (NULL (SETQ TAIL (CDR TAIL))) BRFLG))) (* Prints PROG variables.) LP (COND ((NLISTP TAIL) (GO OUT))) LP1 (ENDLINE) (COND ((NLISTP TAIL) (* ENDLINE resets E when it sees a comment.) (GO OUT)) ((NLISTP (CAR TAIL)) (GO ATM))) (SPACES 4) IN (PROG ((I (IPLUS I 4))) (SUPERPRINT (CAR TAIL) (AND (NULL (SETQ TAIL (CDR TAIL))) BRFLG))) (GO LP) ATM (SETQ V (POSITION)) (SETQ CLISPTEM NIL) (AND CLISPFLG (STRPOS (QUOTE "←") (CAR TAIL)) (SETQ CLISPTEM (CAR TAIL)) (SPACES 4)) (* This atom is not a prog label but an CLISP form, e.g. FOO←NIL. Space it over to line up with the prog clauses.) (PRIN2 (CAR TAIL)) (* Print the label.) (COND ((NLISTP (SETQ TAIL (CDR TAIL))) (GO OUT)) ((NLISTP (CAR TAIL)) (* Two labels in a row.) (ENDLINE) (GO ATM)) [CLISPTEM (COND ((EQ (NTHCHARCODE CLISPTEM -1) (CHARCODE ←)) (* The next element is part of this CLISP expression and should be printed on the same line, e.g. FOO← (FIE)) ) (T (ENDLINE) (SPACES 4] ((ILESSP (SETQ V (IDIFFERENCE (IPLUS 4 V) (POSITION))) 0) (* Long label.) (GO LP1) (* Necessary to go back to LP1 rather than just do the ENDLINE follwwed by 4 spaces because ENDLINE may reset E if a comment is next.) ) (T (SPACES V))) (GO IN) OUT (COND (TAIL (PRIN1 " . ") (SUPERPRINT TAIL))) (RETURN]) (ENDLINE [LAMBDA (N) (* wt: "25-FEB-80 19:12") (COND ((AND DEF FORMFLG (LISTP TAIL) (LISTP (CAR TAIL)) (SUPERPRINTEQ (CAAR TAIL) COMMENTFLG)) (* a comment) (SUPERPRINT (CAR TAIL)) (SETQ TAIL (CDR TAIL)) (ENDLINE N)) (T (ENDLINE1 (OR N I) T))) N]) (ENDLINE1 [LAMBDA (N INBLOCKFLG NOTABSFLG) (* rmk: "12-OCT-81 14:58") (* handles end of line: prints changechar if appropriate, does font changes, terpri, and if N is given, spaces over to that column before restoring font.) (COND ((NULL INBLOCKFLG) (* called from outside the block, e.g. from get*) (EVQ CHANGEFLG) (EVQ FILEFLG) (EVQ LASTCOL))) (LINELENGTH (PROG1 (LINELENGTH) (* LINELENGTH is preserved b/c font changes can cause some systems to reset it) (PROG (FLG TEM (POS (POSITION))) (SETQ TEM (AND FONTCHANGEFLG (CHANGFONT DEFAULTFONT))) (* Wont get right effect if do spaces in variable pitch font.) (COND (CHANGEFLG0 (COND ((AND FILEFLG CHANGECHARTABSTR) (* ↑F↑Tn sequence for positioning to right hand margin.) (PRIN3 CHANGECHARTABSTR) (PRIN1 CHANGECHAR)) ((OR FONTCHANGEFLG (EQ DISPLAYTERMFLG (QUOTE CHAT))) (* prints a c.r. no line feed and then spaces to right margin. reason for doing this is that in most cases can take advantage of tab characters, so in fact will usually result in fewer characters to be printed. also handles the problem of font changes in the line, with the resulting position confusion.) (POSITION NIL 0) (PRIN1 (CONSTANT (CHARACTER 13))) (TABTO (SUB1 LASTCOL) 0 NOTABSFLG) (PRIN1 CHANGECHAR)) ((IGREATERP LASTCOL POS) (* e.g. printing to terminal or printing to file, no font changes, outside of parc) (TABTO (SUB1 LASTCOL) POS NOTABSFLG) (PRIN1 CHANGECHAR))) (SETQ CHANGEFLG0 CHANGEFLG))) (TERPRI) (SETQ CRCNT (ADD1 CRCNT)) (* Used to tell SUBPRINT that a carraiger return was performed, i.e. no longer are on same line as before.) (AND ENDLINEUSERFN (APPLY* ENDLINEUSERFN POS I TAIL)) (* hook for w.t. keeps a list of the tails of the pexpressions being prettyprinted aater each c.r. so that you can make a correspondence between lines on the display and s-expressions.) (AND N (TABTO N 0 NOTABSFLG)) (AND TEM (CHANGFONT TEM]) (TABTO [LAMBDA (TO FROM NOTABSFLG) (* wt: 9-SEP-76 3 21) (PROG (TABFROM TABTO) (COND ([AND FILEFLG PRETTYTABFLG (NULL NOTABSFLG) (NEQ (SETQ TABFROM (IQUOTIENT FROM 8)) (SETQ TABTO (IQUOTIENT TO 8] (* NOTABSFLG is T for printing comments see comment in comment1) (RPTQ (IDIFFERENCE TABTO TABFROM) (PRIN1 (QUOTE % ))) (SPACES (IREMAINDER TO 8)) (POSITION NIL TO)) (T (SPACES (IDIFFERENCE TO FROM]) (READARRAY [LAMBDA (SIZE TYPE ORIG) (* rrb " 4-JUL-80 17:07") (* type is one of: POINTER, FIXP , SMALLPOSP BYTE DOUBLEPOINTER or a number which is the place (between 0 and SIZE) where FIXPs stop and POINTERs begin.) (PROG (X (A (ARRAY SIZE TYPE NIL ORIG)) M DELTA) LP (COND ((NEQ (READC) (QUOTE %()) (GO LP))) (SETQ M 1) (SETQ DELTA (SUB1 (OR ORIG 1))) LP1 (COND ((NOT (IGREATERP M SIZE)) (SETA A (IPLUS M DELTA) (READ)) (SETQ M (ADD1 M)) (GO LP1)) ((NULL (READ)) (* PRINTARRAY writes a NIL if there are no elements in the array for which the left half must be set using SETD, otherwise it writes a T.) (GO OUT))) [SETQ M (COND ((NUMBERP TYPE) (ADD1 TYPE)) ((EQ TYPE (QUOTE DOUBLEPOINTER)) 1) (T (SHOULDNT] LP2 (COND ((NOT (IGREATERP M SIZE)) (SETD A (IPLUS M DELTA) (READ)) (SETQ M (ADD1 M)) (GO LP2))) OUT (READ) (* Reads the final right parentheses surrounding the elements of the array.) (RETURN A]) (FITP [LAMBDA (X TAILFLG ENDTAIL LSTCOL) (* wt: "17-JUN-80 16:29") (* Value is T indicates do not perform carriage return before continuing printing, NIL means do. i.e. doesnt fit. There are two cases, one where X is a tail (only called for the first tail, i.e. CDR of an exprssion) and the second where it is an element. They differ in their treatment of linear lists of atoms. If one is about to print (FOO A B C D E F) and it wont fit on a line, then do a carriage return and staat printing. However, if A B C D E F doesnt fit, doesnt mean to do a carriage return (and then line all the atoms up in a column). The idea is that long lists are given as much room as possible (the first carriage return) but not at the expense of making them be vertical.) (PROG [(N (SUB1 (IDIFFERENCE (OR LSTCOL LASTCOL) (POSITION] (RETURN (COND (TAILFLG (* igreaterp used to compare with 6 kept it consistent for sourrce compare.) (AND (IGREATERP N (IPLUS AVERAGEVARLENGTH 2)) (FITP1 X N ENDTAIL))) (T (FITP2 X N ENDTAIL]) (FITP1 [LAMBDA ($TAIL N ENDTAIL N1) (* ENDTAIL specifies the end of TAIL. This option is used when printing CLISP eexpressions where it is necessary to know if a certain portion of a lst will fit , i.e. between two clispwords.) (* Checks to see if $TAIL could fit in N spaces.) (PROG ((M 0) (FLG T)) LP (COND [(OR (NLISTP $TAIL) (EQ $TAIL ENDTAIL)) (* M is number of characters (plus spaces) in atomic arguments encountered before first non-atomic form or end of TAIL. see COMMENT in FITP) (RETURN (OR TAILFLG (ILESSP M N] [(NLISTP (CAR $TAIL)) (* We have already checked to see if AN average length variable could fit before calling FITP1.) (AND FLG (SETQ M (IPLUS M (ADD1 (COND ((ILESSP N #CAREFULCOLUMNS) (* When getting near right margin, actually perform the nchars check. #CAREFULCOLUMNS is initially set to 20 (it can be set to 100 meaning always perform the nchars check, but this slows down the prettyprinting)) (NCHARS (CAR $TAIL) T)) (T (* Initially 4) AVERAGEVARLENGTH] ((NULL (FITP2 (CAR $TAIL) (OR N1 N))) (* The extra argument to FITP1 is for use in connectionwith CLISPPRETTYWORDS, e.g. FOR, IF, etc. Normally, we figure that any lists can be printed at the position corresponding to the first argument, ut with FOR's and IF's et al, they would always be preceded by the corresponding CLISP word.) (RETURN NIL)) (T (* Non-atomic form reached, stop counting variables since after this will be in vertical format anyway.) (SETQ FLG NIL))) (SETQ $TAIL (CDR $TAIL)) (GO LP]) (FITP2 [LAMBDA (X N ENDTAIL) (* wt: "17-JUN-80 16:30") (PROG (NC) (RETURN (COND ((SUPERPRINTEQ (CAR X) COMMENTFLG) T) [(LISTP (CAR X)) (* Non-atomic CAR of form, e.g. COND clause, open lambda, etc.) (COND ((FITP2 (CAR X) (SETQ N (SUB1 N))) (* SUB1 for the extra left parentheses.) (OR (NULL (CDR X)) (FITP1 (CDR X) (SUB1 N) ENDTAIL] ([ILESSP N (IPLUS 2 (COND ((ILESSP N #CAREFULCOLUMNS) (SETQ NC (NCHARS (CAR X) T))) (T (IPLUS (SETQ NC AVERAGEFNLENGTH) 3] (* Checks to see if there is space for function name and two parentheses. when there are more than #CAREFULCOLUMNS columns left, approximate using value of AVERAGEFNLENGTH. We add 3 to it here just to guarad against a long name at the last minute, i.e. right margin) NIL) ((NULL (CDR X)) T) ((SELECTQ (CAR X) (COND (* The (IPLUS N -2) corresponds to what I would be decremented on the recursive call to superprint.) (SETQ N (IPLUS N -2))) (FUNCTION (SETQ N (IPLUS N -2)) (* 21= the 8 characters in 'FUNCTION' plus the 6 characters in 'LAMBDA' plus 3 characters (minimum) for LAMBDA arglist, plus two parens, and two spaces) (IGREATERP N 21)) ([LAMBDA NLAMBDA] (SETQ N (IPLUS N -2)) (* 11 = 6 characters for LAMBDA plus paren, plus space, plus three characters for arglist.) (IGREATERP N 11)) (SETQ (SETQ N (IPLUS N -2)) (* 6 = 4 characters in SETQ plus paren, plus space) (IGREATERP N (IPLUS 6 AVERAGEVARLENGTH))) (IGREATERP (SETQ N (IDIFFERENCE N (IPLUS NC 2))) (ADD1 AVERAGEFNLENGTH))) (* the default clause in the selectq checks to see if function and at least one atomic argument (we know there is at least one) will fit. The -2 corresponds to the left paren and the space. i dont think the add1 should be there, but in old algorithm, it was a 6, and i wanted files to look exactly the same with new algorithm when #CAREFULCOLUMNS was set to 0) (* The call to FITP1 checks to see if using normal alignment algorithm, the expression can fit.) (FITP1 (CDR X) N ENDTAIL (AND (OR (EQ [CAR (SETQ X (GETPROP X (QUOTE CLISPWORD] (QUOTE IFWORD)) (EQ (CAR X) (QUOTE FORWORD))) (IDIFFERENCE N (IPLUS NC 1]) (WIDEPAPER [LAMBDA (FLG) (* wt: 20-APR-76 0 38) (PROG1 WIDEPAPERFLG (COND ((SETQ WIDEPAPERFLG FLG) (SETQ FILELINELENGTH 120) (SETQ FIRSTCOL 80) (SETQ PRETTYLCOM 28)) (T (SETQ FILELINELENGTH 72) (SETQ FIRSTCOL 48) (SETQ PRETTYLCOM 14]) (ISTTYP [LAMBDA (FILE) (* lmm "24-JUL-83 22:53") (* Default definition of DISPLAYP) (EQ (OR FILE (OUTPUT)) T]) ) (* COPYRIGHT) (DEFINEQ (PRINTCOPYRIGHT [LAMBDA (FILENAME) (* lmm "25-DEC-81 22:16") (* * CALLED BY PRETTYDEF TO PUT a copyright notice on a file. The globalvar COPYRIGHTOWNERS is used to determine the possible copyright owners when it is determined the file doesn't have a copyright yet and has never been asked if the programmer wanted one. The whole copyright mechanism can be turned off by setting COPYRIGHTFLG to NEVER -- originaly NIL. If the file is copyrighted, any year the file is editted the new year is tacked on to the list of copyright years. The copyright notice comes immediately after the FILECREATED expression * *) (PROG (OWNER) (COND ((AND [SETQ OWNER (COND ((GETPROP FILENAME (QUOTE COPYRIGHT))) [(GETPROP FILENAME (QUOTE COPYRIGHTOWNER)) (/PUTPROP FILENAME (QUOTE COPYRIGHT) (CONS (GETPROP FILENAME (QUOTE COPYRIGHTOWNER)) (MKLIST (GETPROP FILENAME (QUOTE COPYRIGHTYEARS] (COPYRIGHTFLG (PRIN1 FILENAME T) (SETQ OWNER (ASKUSER DWIMWAIT (CONSTANT (CHARACTER (CHARCODE LF))) " copyright owner: " (NCONC [MAPCAR COPYRIGHTOWNERS (FUNCTION (LAMBDA (X) (LIST (CAR X) "" (QUOTE EXPLAINSTRING) (CONCAT (CAR X) " - " (CADR X)) (QUOTE RETURN) (CADR X) (QUOTE CONFIRMFLG) T] (CONS [COND ((SETQ OWNER (ASSOC DEFAULTCOPYRIGHTOWNER COPYRIGHTOWNERS)) (LIST (CONSTANT (CHARACTER (CHARCODE LF))) (CONCAT DEFAULTCOPYRIGHTOWNER " ") (QUOTE EXPLAINSTRING) (CONCAT "[LINEFEED] - " (CADR OWNER)) (QUOTE NOECHOFLG) T (QUOTE RETURN) (CADR OWNER))) (T (QUOTE (% "No copyright notice now " EXPLAINSTRING "" NOECHOFLG T RETURN NIL] DEFAULTCOPYRIGHTKEYLST)) T T)) (AND OWNER (/PUTPROP FILENAME (QUOTE COPYRIGHT) (LIST OWNER] (NEQ (CAR OWNER) (QUOTE NONE))) (PROG [(CURRENTYEAR (PACK* "19" (SUBSTRING (DATE) 8 9] (OR (MEMBER CURRENTYEAR (CDR OWNER)) (NCONC1 OWNER CURRENTYEAR))) (PRINTCOPYRIGHT1 OWNER]) (PRINTCOPYRIGHT1 [LAMBDA (OWNER) (* lmm "25-DEC-81 22:26") [MAPRINT (CDR OWNER) NIL "(* Copyright (c) " " by " ", " (FUNCTION (LAMBDA (YEAR) (PRINTNUM (QUOTE (FIX 4)) YEAR] (PRIN1 (CAR OWNER)) (PRIN1 ")") (TERPRI) (TERPRI]) (SAVECOPYRIGHT [LAMBDA (FILENAME) (* lmm "25-DEC-82 16:48") (* CALLED FROM PRETTYDEF TO SAVE COPYRIGHT INFO ON END OF FILE) (AND (NEQ COPYRIGHTFLG (QUOTE NEVER)) (PROG (X) (COND ((SETQ X (GETPROP FILENAME (QUOTE COPYRIGHT))) (PRINT (LIST (QUOTE PUTPROPS) FILENAME (QUOTE COPYRIGHT) X]) ) [DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (BLOCK: NIL PRINTCOPYRIGHT PRINTCOPYRIGHT1 SAVECOPYRIGHT (LOCALVARS . T) (NOLINKFNS PRINTCOPYRIGHT1)) ] (DECLARE: DOEVAL@COMPILE DONTCOPY (ADDTOVAR GLOBALVARS COPYRIGHTFLG COPYRIGHTOWNERS DEFAULTCOPYRIGHTKEYLST DEFAULTCOPYRIGHTOWNER) ) (RPAQ? COPYRIGHTFLG ) (RPAQ? DEFAULTCOPYRIGHTOWNER ) (RPAQ? COPYRIGHTPRETTYFLG T) (RPAQ? COPYRIGHTOWNERS ) (RPAQ? DEFAULTCOPYRIGHTKEYLST (QUOTE ((NONE " " EXPLAINSTRING "NONE - No copyright ever on this file" CONFIRM T RETURN (QUOTE NONE)) [%[ "owner: " EXPLAINSTRING "[ - new copyright owner -- type one line of text" NOECHOFLG T KEYLST (( " " RETURN (SUBSTRING (CADR ANSWER) 2 -2] (%] "No copyright notice now " EXPLAINSTRING "] - no copyright notice now" NOECHOFLG T RETURN NIL)))) (DECLARE: DOEVAL@COMPILE DONTCOPY (ADDTOVAR GLOBALVARS COPYRIGHTOWNERS DEFAULTCOPYRIGHTKEYLST COPYRIGHTPRETTYFLG COMMENTFLG) ) (DEFINEQ (COMMENT1 [LAMBDA (L INBLOCKFLG) (* rmk: "24-MAY-82 00:08") (* INBLOCKFLG is NIL for entries fro outside the block, e.g. for users who want to reset some variables or linelength, etc., and then call comment1.) (COND ((NULL INBLOCKFLG) (EVQ EXPR) (EVQ FILEFLG) (EVQ CHANGEFLG))) (RESETVARS [(FONTCHANGEFLG (COND (FILEFLG FONTCHANGEFLG) (T (EQ FONTCHANGEFLG (QUOTE ALL] (RETURN (PROG (X FC LC MC STR TEM (LASTCOL (AND INBLOCKFLG LASTCOL)) NEWLASTCOL (TAIL TAIL) MIDFLG) (SETQ NEWLASTCOL (AND FONTCHANGEFLG COMMENTFONT COMMENTLINELENGTH)) (COND ((AND (EQ (CADR L) (QUOTE E)) [NOT (ATOM (SETQ X (CADDR L] (NULL (CDDDR L))) (EVAL X))) [COND ((AND **COMMENT**FLG (NULL FILEFLG)) (* for editing purposes.) (RETURN (PRIN1 **COMMENT**FLG] (SETQ X L) [COND ((AND (NOT (SUPERPRINTEQ (CADR L) COMMENTFLG)) (ILESSP (COUNT L) PRETTYLCOM)) (SETQ FC (OR (CAR (LISTP FIRSTCOL)) FIRSTCOL)) (SETQ LC (OR (CAR NEWLASTCOL) LASTCOL (LINELENGTH))) (* If NEWLASTCOL is non-nil, means users is using a smaller font for comments and wants a larger linelength. CAR is the linelength to be used for comments in right margin, CDR for those to be centered. LASTCOL would be NIL at this point for calls from outside of he block, so recompute linelength, rather than calling evq, since user might have reset linelength before calling comment1.) (SETQ MC (IQUOTIENT (IPLUS FC LC) 2))) (T (SETQ MIDFLG T) (SETQ FC (OR (CDR (LISTP FIRSTCOL)) 10)) (SETQ LC (OR (CDR NEWLASTCOL) (IPLUS (OR LASTCOL (LINELENGTH)) -10))) (ENDLINE1 NIL T) (ENDLINE1 NIL T) (SETQ MC (IPLUS LC -25] (AND (NULL LASTCOL) (SETQ LASTCOL LC)) (* in case user has called COMMENT1 when not under printdef at all (not supposed to)) [COND ((EQ (CADR X) (QUOTE %%)) (/RPLACD X (COMMENT3 (CDDR X) EXPR T] (SETQ STR (AND FONTCHANGEFLG (CHANGFONT DEFAULTFONT))) (* Want to be in defaultfont before we space over.) (SETQ TAIL (CDR TAIL)) (* because the coment is already printed. TAIL is used in ENDLINE1 and is the tail of the expression yet to be prited.) [COND ((IGREATERP (IPLUS (SETQ TEM (POSITION)) 3) FC) (* If justcaaled TAB, it would do terpri, and the changechar wouldnt get printed.) (ENDLINE1 FC T T) (* the extra argument to endline1 supresses the use of tabs. dont want it to use tabs as this will screw up the value rturned by position, and this would make the normalcommentsflg=NIL feature not work.) ) (T (SPACES (IDIFFERENCE FC TEM] (COND ((AND STR COMMENTFONT) (CHANGFONT COMMENTFONT) (RESETFORM (LINELENGTH LC) (COMMENT2 L FC MC LC)) (* permits user to specify different linelength for comments. useful when comments are printed in smaller fonts. most users using font package will use this facility.) (CHANGFONT STR)) (T (COMMENT2 L FC MC LC))) (COND (MIDFLG (* comment in middle of line.) (ENDLINE1 NIL T) (ENDLINE1 NIL T))) (RETURN L]) (COMMENT2 [LAMBDA (TAIL FC MC LC) (* rmk: "23-MAY-82 23:56") (PROG (LAST POS) (PRIN1 (QUOTE %()) (COND ((NLISTP (CAR TAIL)) (PRIN2 (CAR TAIL))) (T (COMMENT2 (CAR TAIL) FC MC LC))) LP (SETQ POS (POSITION)) [COND ((NULL (SETQ TAIL (CDR TAIL))) (GO EXIT)) ((NLISTP TAIL) (PRIN1 (QUOTE " . ")) (PRIN2 TAIL) (GO EXIT)) ((OR (EQ LAST (QUOTE -)) (AND (NOT (NUMBERP LAST)) (SELCHARQ (NTHCHARCODE LAST -1) (; (IGREATERP POS MC)) [%. (AND (IGREATERP POS MC) (NULL (FMEMB LAST ABBREVLST] NIL))) (ENDLINE1 (SETQ POS FC) T)) ((AND (NOT (ATOM LAST)) (SELECTQ (CAR TAIL) ((, ; : %.) (* Don't space) (PRIN1 (CAR TAIL)) (GO LP)) NIL))) ((EQ POS LC) (ENDLINE1 (SETQ POS FC) T)) (T (SPACES 1) (SETQ POS (ADD1 POS] (COND ((LISTP (SETQ LAST (CAR TAIL))) (* new line before printing the list.) (COND ((IGREATERP POS MC) (ENDLINE1 (SETQ POS FC) T))) (COMMENT2 LAST FC MC LC) (GO LP)) ((IGREATERP [SETQ POS (IPLUS POS (NCHARS LAST) (COND ((CDR TAIL) 0) (T (* leave space for the paren, i.e. dont print last atom on one line and the paren on the next) 1] LC) (* LC is the last column that can be printed in.) (ENDLINE1 (SETQ POS FC) T))) (PRIN2 LAST) (GO LP) EXIT(PRIN1 (QUOTE %)]) (COMMENT3 [LAMBDA (X FORM FLG) (PROG (Y Z VARS) (* FLG = T means first letter in word is capitalized.) [AND (FNTYP FORM) (SETQ VARS (APPEND (CAR (SETQ Y (COMMENT5 FORM))) (CADR Y] (* Gets Free And Bound Variables.) (SETQ Y X) LP (FRPLACA Y (COMMENT4 (CAR Y))) [COND ((LISTP (SETQ Z (CDR Y))) (SETQ Y Z) (GO LP)) (Z (FRPLACD Y (COMMENT4 Z] (RETURN X]) (COMMENT4 [LAMBDA (X) (* rmk: "24-MAY-82 00:09") (PROG (Y TEM) (COND [(LISTP X) (COND ((NOT (AND (GETD (CAR X)) (ILESSP (LENGTH X) 5))) (* If it looks like a FORM, don't lowercase.) (SETQ X (COMMENT3 X FORM] ((EQ X (QUOTE -)) (SETQ FLG T) (RETURN X)) ((OR (EQ X (QUOTE ↑)) (EQ X (QUOTE %%)) (EQ X (QUOTE 'S)) (NOT (LITATOM X))) (* Note that strings are left in upper case. However, the editor's LOWER and RAISE commands do work on strings.) ) ((EQ (SETQ TEM (CHCON1 X)) (CHARCODE ↑)) (* Leave in uppercase) (SETQ X (SUBATOM X 2))) ((EQ TEM (CHARCODE %%)) (* Make lowercase regardless) (SETQ X (L-CASE1 (CDR (DCHCON X CHCONLST)) FLG))) ((STRPOS (QUOTE =) X)) (T (SETQ Y X) (GO LP))) OUT [SETQ FLG (AND (LITATOM X) (EQ (NTHCHARCODE X -1) (CHARCODE %.)) (NOT (FMEMB X ABBREVLST] (* FLG=T means capitalize next word.) (RETURN X) LP (SELCHARQ (NTHCHARCODE Y -1) ((%. ; : ,) (SETQ Y (SUBATOM Y 1 -2)) (* Remove punctuation and loop so that 'FOO', and FOO's, will be handled correctly.) (GO LP)) [S (COND ((EQ (NTHCHARCODE Y -2) (CHARCODE ')) (SETQ Y (SUBATOM Y 1 -3)) (SETQ X (MKATOM (RPLSTRING X (STRPOS (QUOTE "'S") X) (QUOTE "'s"] [' (COND ((EQ (CHCON1 Y) (CHARCODE ')) (* X is TO be left in uppercase. THE check is made here instead of earlier TO allow FOR ' TO be handled properly.) (GO OUT] NIL) [COND ([NOT (AND (NOT (FMEMB Y LCASELST)) (OR (FMEMB Y UCASELST) (GETD Y) (BOUNDP Y) (GETPROPLIST Y) (FMEMB Y VARS] (* Words on LCASELST are always lower-cased, words on UCASELST always uppercased, otherwise, if word is a function or variable with top level binding or local binding or has a property list, leave it in uppercase) (SETQ X (L-CASE X FLG] (GO OUT]) (COMMENT5 [LAMBDA (FORM) (PROG (TEM) (RETURN (LIST (COND ((ATOM (SETQ TEM (CADR FORM))) (LIST TEM)) (T TEM)) (AND (EQ [CAR (SETQ TEM (CAR (LAST FORM] (QUOTE PROG)) (MAPCAR (CADR TEM) (FUNCTION (LAMBDA (X) (COND ((ATOM X) X) (T (CAR X]) ) (RPAQ? BRLST ) (RPAQ? COMMENTFLG (QUOTE *)) (RPAQ? **COMMENT**FLG (QUOTE " **COMMENT** ")) (RPAQ? PRETTYFLG T) (RPAQ? #RPARS 4) (RPAQ? CLISPIFYPRETTYFLG ) (RPAQ? PRETTYTRANFLG ) (RPAQ? FONTCHANGEFLG ) (RPAQ? CHANGECHARTABSTR ) (RPAQ? PRETTYTABFLG T) (RPAQ? DECLARETAGSLST (QUOTE (COMPILERVARS COPY COPYWHEN DOCOPY DOEVAL@COMPILE DOEVAL@LOAD DONTCOPY DONTEVAL@COMPILE DONTEVAL@LOAD EVAL@COMPILE EVAL@COMPILEWHEN EVAL@LOAD EVAL@LOADWHEN FIRST NOTFIRST))) (RPAQ? WIDEPAPERFLG ) (RPAQ? AVERAGEVARLENGTH 4) (RPAQ? AVERAGEFNLENGTH 5) (RPAQ? #CAREFULCOLUMNS 0) (RPAQ? CHANGECHAR (QUOTE %|)) (RPAQ? LASTFONT ) (RPAQ? ENDLINEUSERFN ) (RPAQ? PRETTYDEFMACROS ) (RPAQ? PRETTYPRINTMACROS ) (RPAQ? PRETTYEQUIVLST ) (RPAQ? PRETTYPRINTYPEMACROS ) (RPAQ? FILEPKGCOMSPLST (QUOTE (DECLARE: SPECVARS LOCALVARS GLOBALVARS PROP IFPROP P VARS INITVARS ADDVARS APPENDVARS FNS ARRAY E COMS ORIGINAL ADVISE ADVICE BLOCKS *))) (RPAQ? SYSPROPS (QUOTE (PROPTYPE ALISTTYPE DELDEF EDITDEF PUTDEF GETDEF WHENCHANGED NOTICEFN NEWCOMFN PRETTYTYPE DELFROMPRETTYCOM ADDTOPRETTYCOM ACCESSFN ACS ADVICE ADVISED ALIAS AMAC ARGNAMES BLKLIBRARYDEF BRKINFO BROADSCOPE BROKEN BROKEN-IN CLISPCLASS CLISPCLASSDEF CLISPFORM CLISPIFYISPROP CLISPINFIX CLISPISFORM CLISPISPROP CLISPNEG CLISPTYPE CLISPWORD CLMAPS CODE CONVERT COREVAL CROPS CTYPE EDIT-SAVE EXPR FILE FILECHANGES FILEDATES FILEDEF FILEGROUP FILEHISTORY FILEMAP FILETYPE GLOBALVAR HISTORY I.S.OPR I.S.TYPE INFO LASTVALUE LISPFN MACRO MAKE NAMESCHANGED NARGS OLDVALUE OPD READVICE SETFN SUBR UBOX UNARYOP VALUE \DEF CLISPBRACKET TRYHARDER))) (DECLARE: DONTCOPY EVAL@COMPILE (FILESLOAD (IMPORT) FILEPKG) ) (DECLARE: DONTEVAL@LOAD DOCOPY (WIDEPAPER) (SETLINELENGTH) (MOVD? (QUOTE ISTTYP) (QUOTE DISPLAYP)) (MOVD? (QUOTE NILL) (QUOTE COMPUTEPRETTYPARMS)) ) [DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (BLOCK: PRETTYPRINTBLOCK PRETTYPRINT PRETTYPRINT1 PRETTYPRINT2 (ENTRIES PRETTYPRINT) (SPECVARS FNSLST FILEFLG)) (BLOCK: PRETTYBLOCK PRINTDEF SUPERPRINT SUPERPRINT0 SUPERPRINTEQ SUPERPRINTGETPROP SUBPRINT SUBPRINT1 SUBPRINT2 CHANGFONT PRINTPROG RPARS ENDLINE ENDLINE1 TABTO FITP FITP1 FITP2 COMMENT1 COMMENT2 (ENTRIES PRINTDEF CHANGFONT ENDLINE1 COMMENT1 FITP SUPERPRINTEQ SUPERPRINTGETPROP) (LOCALFREEVARS I LASTCOL FORMFLG E TAIL TAILFLG EXPR CRCNT FILEFLG FNSLST CHANGEFLG DEF) (BLKLIBRARY GETPROP) (SPECVARS CHANGEFLG LASTCOL FILEFLG E TAIL EXPR TYPE)) (BLOCK: NIL CHANGEFONT COMMENT3 COMMENT4 COMMENT5 ENDFILE ISTTYP MAKEDEFLIST PP PP* PPT PRETTYCOM PRETTYCOM1 PRETTYCOMPRINT PRETTYDEF PRETTYDEF0 PRETTYDEF1 PRETTYVAR PRETTYVAR1 PRINTDATE PRINTDATE1 PRINTDEF1 PRINTFNS READARRAY WIDEPAPER (LINKFNS . T)) ] (DECLARE: DOEVAL@COMPILE DONTCOPY (ADDTOVAR GLOBALVARS UCASELST LCASELST DECLARETAGSLST LISPXPRINTFLG SYSPROPS FILEPKGCOMSPLST DWIMLOADFNSFLG LAMBDAFONTLINELENGTH PRETTYCOMFONT WIDEPAPERFLG PRETTYHEADER BUILDMAPFLG FILERDTBL NORMALCOMMENTSFLG FILELINELENGTH FONTFNS FONTWORDS USERFONT CLISPFONT SYSTEMFONT COMMENTFONT CHANGEFONT PRETTYTABFLG AVERAGEFNLENGTH AVERAGEVARLENGTH #CAREFULCOLUMNS CHANGECHAR LASTFONT CHANGEFLG0 DISPLAYTERMFLG UNDERLINEON UNDERLINEOFF PRETTYEQUIVLST COMMENTLINELENGTH CHANGEFLG0 ENDLINEUSERFN FONTPROFILE PRETTYFLG CHANGESARRAY PRETTYPRINTYPEMACROS PRETTYPRINTMACROS CLISPTRANFLG PRETTYTRANFLG CLISPARRAY #RPARS CLISPCHARS FUNNYATOMLST CHCONLST CLISPFLG PRETTYLCOM FIRSTCOL **COMMENT**FLG ABBREVLST CHANGECHARTABSTR FILEPKGFLG FONTCHANGEFLG DEFAULTFONT LAMBDAFONT CLISPIFYPRETTYFLG LISPXHISTORY DWIMFLG USERWORDS ADDSPELLFLG COMMENTFLG CLISPIFYPACKFLG) ) (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA PPT PP* PP) (ADDTOVAR NLAML PRETTYCOMPRINT) (ADDTOVAR LAMA ) ) (PUTPROPS PRETTY COPYRIGHT (NONE)) (DECLARE: DONTCOPY (FILEMAP (NIL (5521 79681 (PRETTYDEF 5531 . 13051) (PRETTYDEF0 13053 . 13294) (PRETTYDEF1 13296 . 15574) (PRINTDATE 15576 . 17407) (PRINTDATE1 17409 . 18726) (PRINTFNS 18728 . 19555) (PRETTYCOM 19557 . 28211) (PRETTYCOMPRINT 28213 . 28289) (PRETTYVAR 28291 . 29632) (PRETTYVAR1 29634 . 31756) ( PRETTYCOM1 31758 . 32918) (ENDFILE 32920 . 33076) (MAKEDEFLIST 33078 . 33662) (PP 33664 . 33956) (PP* 33958 . 34313) (PPT 34315 . 34669) (PRETTYPRINT 34671 . 39586) (PRETTYPRINT1 39588 . 42247) ( PRETTYPRINT2 42249 . 43696) (PRINTDEF1 43698 . 43767) (PRINTDEF 43769 . 45236) (SUPERPRINT 45238 . 46379) (SUPERPRINT0 46381 . 50758) (SUPERPRINTEQ 50760 . 50863) (SUPERPRINTGETPROP 50865 . 51059) ( RPARS 51061 . 51641) (SUBPRINT 51643 . 63298) (SUBPRINT1 63300 . 63970) (SUBPRINT2 63972 . 64544) ( CHANGEFONT 64546 . 65158) (CHANGFONT 65160 . 66192) (PRINTPROG 66194 . 68532) (ENDLINE 68534 . 68922) (ENDLINE1 68924 . 71519) (TABTO 71521 . 72059) (READARRAY 72061 . 73315) (FITP 73317 . 74527) (FITP1 74529 . 76456) (FITP2 76458 . 79160) (WIDEPAPER 79162 . 79495) (ISTTYP 79497 . 79679)) (79704 82838 ( PRINTCOPYRIGHT 79714 . 82139) (PRINTCOPYRIGHT1 82141 . 82452) (SAVECOPYRIGHT 82454 . 82836)) (83806 92518 (COMMENT1 83816 . 87617) (COMMENT2 87619 . 89309) (COMMENT3 89311 . 89834) (COMMENT4 89836 . 92185) (COMMENT5 92187 . 92516))))) STOP