THURSDAY JAN 06,1977 FM+1D.23H.52M.11S. LISP 1252 - GLS - WELL, FOLKS, JONL HAS GONE TO IBM FOR SEVERAL MOONS, AND I AM WORKING ON MY THESIS THIS SEMESTER (DUE IN MAY), SO DON'T EXPECT TO GET NEW FEATURES IMPLEMENTED WITH BLINDING SPEED. I WILL DO MY BEST TO FIX ANY BUGS THAT CROP UP (IN PARTICULAR, I BELIEVE I HAVE FIXED THE NEFARIOUS FASLOAD BUG OF VERSION 1251). MOST OF THE ITEMS BELOW ARE NOT BRAND NEW, BUT JUST THINGS THAT DIDN'T WORK UNTIL NOW OR WERE NEVER DOCUMENTED PROPERLY. AS USUAL, NUMBERS=ALL LISPS, LETTERS=NEWIO ONLY. [1] PRINC NOW NO LONGER AUTO-TERPRI'S BEFORE ATOMS. [2] NEW "EVALSHUNT" HACK FOR PECULIAR FORMS. [3] GC NOW MARKS HUNKS MORE SPACE-EFFICIENTLY. [4] HOW TO DEFINE NEW EDITOR COMMANDS. [A] NEW FUNCTION: +TYO [B] SEEING GC STATISTICS IN THE WHO-LINE. ---------------------------------------------------------------- [1] PRINC NOW NO LONGER ATTEMPTS TO GET IN A TERPRI BEFORE AN ATOM IF NECESSARY. (IT DOES, HOWEVER, PROVIDE A TERPRI ON REACHING THE LINEL UNLESS OTHERWISE OVERRIDDEN BY THE VALUE OF TERPRI OR BY (SSTATUS TERPRI ...).) PRIN1 CONTINUES TO PUT IN AUTO-TERPRI'S BEFORE ATOMS. [2] WHEN EVAL COMES UPON A FORM WHOSE CAR IS NON-ATOMIC AND WHOSE CAAR IS NOT LAMBDA, FUNARG, OR LABEL, AND IF THE VALUE OF THE ATOM EVAL IS NON-NIL, THEN THIS VALUE SHOULD BE A FUNCTION OF ONE ARGUMENT, AND IT IS CALLED ON THE FORM. IT IS THE RESPONSIBILITY OF THE FUNCTION TO EVALUATE THE FORM AND DELIVER AN APPROPRIATE VALUE. THIS IS KNOWN AS THE "EVALSHUNT" KLUDGE. [3] GC NOW TAKES MUCH LESS PDL TO MARK HUNKS. IF YOU HAVE GOTTEN PDL OVERFLOW DURING GC WHILE USING HUNKS, THIS SHOULD ALLEVIATE YOUR PROBLEM. [4] IF EDIT READS A COMMAND WHOSE NAME IS NOT RECOGNIZED, THEN IF THE ATOM OF THAT NAME HAS AN EDIT PROPERTY, THEN THAT PROPERTY SHOULD BE A FUNCTION. IT WILL BE CALLED WITH THE REPEAT COUNT AS AN ARGUMENT (0 IS SUPPLIED IF NO ARGUMENT IS GIVEN). THE FUNCTION MAY DO ANYTHING IT LIKES, BUT WILL PROBABLY WANT TO OPERATE ON THE FUNCTION BEING EDITED. THE EDITOR'S CURSOR IS REPRESENTED BY TWO DATA STRUCTURES, THE "LEFT-LIST" AND THE "UP-LIST". THE FORMER SAYS HOW TO BACK UP AT THE CURRENT LEVEL OF LIST; THE LATTER SAYS HOW TO BACK UP A LEVEL OF LIST STRUCTURE. THE LEFT-LIST IS THE VALUE OF THE ATOM (THREE ALTMODES), AND THE UP-LIST IS THE VALUE OF THE ATOM ^^^ (THREE UPARROWS OR CIRCUMFLEXES, ASCII 136). THE CAR OF THE LEFT-LIST IS THE LEVEL OF LIST STRUCTURE BEING EDITED; THE CURSOR IS CONSIDERED TO BE BEFORE THE CAAR OF THE LEFT-LIST. THE CDR OF THE LEFT-LIST IS THE LEFT-LIST FOR THE PREVIOUS POINT IN THIS LEVEL OF LIST. THE UP-LIST IS A STACK OF OLD LEFT-LISTS. THE FOLLOWING FUNCTIONS ARE USEFUL UTILITIES FOR BUILDING NEW EDITOR FUNCTIONS, AND ILLUSTRATE THE CORRECT WAY TO MANIPULATE THE LEFT-LIST AND UP-LIST. (DEFUN RIGHT () (AND (EDCAR) (SETQ (CONS (CDAR ) )))) (DEFUN LEFT () (AND (CDR ) (SETQ (CDR )))) (DEFUN DOWN () (AND (EDCAAR) (SETQ ^^^ (CONS ^^^) (NCONS (CAAR ))))) (DEFUN UP () (AND ^^^ (CAR ^^^) (CDR ^^^) (SETQ (CAR ^^^) ^^^ (CDR ^^^)))) (DEFUN YANK (FN) ((LAMBDA (PL) (COND (PL (SETQ ^^^ NIL) (SETQ (NCONS PL))) (T (PRINC '|??|)))) (GETL FN EDIT))) (DEFUN SPLICE (IT) (COND ((AND (LEFT) (EDCAR)) (RPLACD (CAR ) IT) (RIGHT)) ((AND (UP) (EDCAR)) (RPLACA (CAR ) IT) (DOWN)))) (DEFUN KILL () (PROG2 NIL (CAAR ) (SPLICE (COND ((EDCAR) (CDAR )) (T (CAR )))))) (DEFUN INSERT (IT) (SPLICE (CONS IT (AND (CAR )))) (RIGHT)) (DEFUN EDCAR () (AND (NOT (ATOM (CAR ))))) (DEFUN EDCAAR () (AND (EDCAR) (NOT (ATOM (CAAR ))))) NOTICE THAT LEFT AND RIGHT AND UP AND DOWN RETURN NIL IF THEY FAIL. KILL RETURNS THE THING KILLED (THE STANDARD EDITOR COMMAND "K" PUTS THIS THING INTO THE VALUE CELL OF "".) AS TWO EXAMPLES OF NEW EDITOR COMMANDS, CONSIDER "XCH" (NOTE THAT NAMES OF EDITOR COMMANDS MUST BE THREE CHARACTERS OR FEWER), WHICH TRANSPOSES THE NEXT TWO ITEMS AFTER THE CURSOR, AND "BRY", WHICH BURIES THE NEXT THING IN <ARGUMENT> LEVELS OF LIST STRUCTURE. (DEFPROP XCH ED-EXCHANGE EDIT) (DEFUN ED-EXCHANGE (N) ;ARGUMENT IS IGNORED (INSERT (PROG2 NIL (KILL) (RIGHT)))) (DEFPROP BRY ED-BURY EDIT) (DEFUN ED-BURY (N) (AND (EDCAR) (DO ((I (MAX N 1) (- I 1))) ((ZEROP I)) (SPLICE (RPLACA (CAR ) (NCONS (CAAR ))))))) I HAVE TESTED THESE DEFINITIONS AND THEY SEEM TO WORK. [A] THE NEW FUNCTION +TYO OF TWO ARGUMENTS IS A SUPER-FAST TYO. THE FIRST ARGUMENT IS THE ASCII VALUE TO OUTPUT AND THE SECOND IS THE FILE TO OUTPUT IT ON. THE ATOM "T" MAY NOT BE USED AS A SECOND ARGUMENT; INSTEAD OF (+TYO 43 T), SAY (+TYO 43 TYO) OR THE EQUIVALENT. ALSO, THE SECOND ARGUMENT MUST BE A SINGLE FILE, NOT A LIST OF FILES. THE +TYO FUNCTION DOES NO ARGUMENT CHECKING IF NOT IN *RSET MODE. IT DOES NOT ATTEMPT TO UPDATE THE CHARPOS OF THE FILE, OR SUPPLY AN AUTO-TERPRI FOR EXCEEDING THE LINEL. IT DOES CHECK FOR NON-IMAGE-MODE TTY FILES AND IN THAT CASE CONVERT ^P AND ^C TO ^P P AND ^P Q. IT ALSO UPDATES THE FILEPOS CORRECTLY. [B] NEWIO HAS HAD FOR SOME TIME STATUS CALLS FOR MANIPULATING THE WHO-LINE; THESE WERE DESCRIBED PREVIOUSLY IN LISP ARCHIV. NOW A NEW STATUS CALL CONTROLS THE DISPLAY OF GC STATISTICS IN THE WHO-LINE. (STATUS GCWHO) RETURNS THE CURRENT GCWHO STATUS AS A FIXNUM. (SSTATUS GCWHO <N>) SETS THE STATUS TO THE FIXNUM <N>. RIGHT NOW ONLY THE 1 AND 2 BITS OF THE STATUS ARE SIGNIFICANT. 1 MEANS THAT DURING A GC, THE WHO-LINE SHOULD BE ALTERED TO READ "GC:XXXXX" WHERE XXXXX IS THE REASON FOR THE GC. AT THE END OF THE GARBAGE COLLECTION THE WHO-LINE IS RESTORED. 2 MEANS THAT AT THE END OF THE GC THE .WHO2 WORD SHOULD BE CLOBBERED WITH GC RUN TIME INFORMATION. SPECIFICALLY, THE LEFT HALF GETS THE PERCENTAGE OF RUN TIME WHICH HAS BEEN SPENT IN GC, AND THE RIGHT HALF GETS THE GC RUN TIME IN FORTIETHS OF A SECOND. IF THE FIRST TWO ARGUMENTS TO (SSTATUS WHO1 ...) ARE 52 OCTAL AND '%, THEN THESE STATISTICS WILL BE PRINTED IN THE FORM "NNN% HH:MM:DD.T", JUST LIKE THE STANDARD SYSTEM RUNTIME PERCENTAGE AND VALUE. IN THIS WAY ONE CAN CONTINUOUSLY MONITOR GC RUN TIME STATISTICS. THE 1 AND 2 BITS MAY BE USED TOGETHER (3) OR INDEPENDENTLY. NOTE THAT WHILE USING THE 2 BIT THE .WHO3 VARIABLE IS STILL LEFT OVER FOR USE BY THE USER. THUS ONE MIGHT SAY: (SSTATUS WHO1 52 '% 166 0) (SSTATUS GCWHO 3) (SSTATUS WHO3 'QUUX) AND ONE WOULD NORMALLY SEE "43% 00:15:07.8 QUUX", BUT DURING A GC ONE WOULD SEE "GC:FIXNUM" OR WHATEVER. A NOTE FOR THOSE WHO USE SUSPEND: IF THE SUSPENDED JOB IS DUMPED OUT AND LATER RELOADED, THE RUNTIME (MAINTAINED BY THE TIME-SHARING SYSTEM) WILL HAVE BEEN RESET, BUT NOT THE GCTIME, WHICH IS MAINTAINED BY LISP. THEREFORE A ROUTINE WHICH DOES A SUSPEND SHOULD PERFORM (SSTATUS GCTIME 0) ON RETURN FROM THE SUSPEND IN ORDER TO MAKE THE WHO-LINE AND OTHER GC STATISTICS ACCURATE.