TUESDAY JUNE 15,1976 FM+3D.2H.27M.33S. LISP 1160 - GLS -
NOTE THAT NUMBERED ITEMS ARE FOR BOTH NEWIO AND OLDIO,
WHILE LETTERED ITEMS ARE FOR NEWIO ONLY. NOTE ALSO THAT
NUMBERED AND LETTERED ITEMS ARE INTERMIXED SLIGHTLY.
[0] NEW COMPILER FEATURES
[0A] (PROGN 'COMPILE A1 ... AN) AT TOP LEVEL COMPILES A1 ... AN
[0B] (DEFUN (FOO BAR) ...) PULLS A SPECIAL GENSYM HACK
[0C] (RECOMPL '(A B C ...)) IS USED TO RECOMPILE A FILE
[0D] THE COMPILER NOW RECOGNIZES (CGOL) SPECIALLY
[1] THE VARIABLE ZFUZZ CONTROLS PRECISION OF PLUS AND DIFFERENCE
[2] DEFPROP AND DEFUN DO A REMPROP LOOP, NOT JUST A SINGLE REMPROP
[3] P% IS "LISP TYPEOUT MODE", AND GETS SET UP IN & IF POSSIBLE
[A] TYI ARRANGES TO READ NON-ACTIVATION CHARACTERS
[B] TYI ON TTY DOESN'T CONFUSE CURSORPOS ANY MORE
[C] THE VARIABLES TYI AND TYO CONTAIN THE INITIAL TTY FILE OBJECTS
[D] SETQ OF READ NOW WORKS IN NEWIO; "LOAD" USES IT TOO
[E] RECALL THAT HH$X IS BB$X IN NEWIO
[F] SPECIAL TREATMENT OF CTRL AND META CHARACTERS IN NEWIO
[G] MAR INTERRUPT FEATURE
[F1] THE MAR-BREAK USER INTERRUPT
[F2] (STATUS MAR) AND (SSTATUS MAR)
[F3] SUSPEND SAVES AND RESTORES THE MAR
[F4] ^G CIRCUMVENTS THE MAR ON RESTORED VARIABLES
[H] OTHER NEW USER INTERRUPTS
[G1] TTY-RETURN (TTY JUST RETURNED TO THE JOB)
[G2] SYS-DEATH AND (STATUS ITS)
[G3] MACHINE-ERROR (MEMORY ERRORS, ILLEGAL OPERS, PARITY ERRORS)
[4] HUNKS PACKAGE
[5A] NEW DATA TYPES
[5B] NEW PRIMITIVES: CXR, RPLACX, HUNK, HUNKIFY, HUNKSIZE
[5C] EQUAL AND SXHASH TREAT HUNKS SPECIALLY
[5D] PRINT TREATS HUNKS SPECIALLY
[5E] TREATMENT OF HUNKS AS LIST STRUCTURE
[5F] (STATUS FEATURE HUNK)
[5G] (STATUS SPCNAMES)
[5H] (STATUS GCSIZE), ETC., AND (ALLOC X)
[I] HUMBLE PACKAGE FOR HACKING INFERIOR JOBS ON ITS
[I1] SPECIAL VARIABLES AND THE JOB TABLE
[I2] CREATE-JOB
[I3] SELECT-JOB
[I4] KILL-JOB
[I5] LOAD-JOB
[I6] JOB-USET-READ AND JOB-USET-WRITE
[I7] EXAMINE-JOB AND DEPOSIT-JOB
[I8] *ATTY AND *DTTY
[I9] AUXILIARY PACKAGES
----------------------------------------------------------------
[0] NEW COMPILER FEATURES
[0A] IF THE FORM (PROGN 'COMPILE A1 ... AN) IS SEEN
AT THE TOP LEVEL OF A FILE, THE COMPILER COMPILES
THE FORMS A1 ... AN AS IF THEY ALL WERE SEEN AT TOP LEVEL.
IN THIS WAY A MACRO CAN "RETURN MULTIPLE FORMS" TO BE
COMPILED (AFTER ALL, THE CONSTRUCT ALSO WORKS IN THE
INTERPRETER).
[0B] (DEFUN (FOO BAR) ...) IN THE INTERPRETER DEFINES FOO
TO HAVE A BAR PROPERTY WHICH IS A LAMBDA EXPRESSION.
THE COMPILER CREATES A GENSYM G0034, OUTPUTS THE FORM
(DEFPROP FOO G0034 BAR),
AND THEN COMPILES THE FUNCTION UNDER THE NAME G0034.
IN THIS WAY (FUNCALL (GET 'FOO 'BAR) ...) WILL ALWAYS
WORK, FOR EXAMPLE.
CONTRAST THIS WITH (DEFUN (FOO BAR BAZ) ...), WHICH
IN THE INTERPRETER GIVES FOO A BAR PROPERTY, AND WHEN
COMPILED GIVES FOO A BAZ PROPERTY.
[0C] THE VARIABLE RECOMPL, IF NON-NIL, CAUSES THE COMPILER
TO IGNORE ALL FORMS IN A FILE EXCEPT DECLARATIONS
AND FUNCTIONS WHOSE NAMES APPEAR IN THE LIST WHICH
IS THE VALUE OF RECOMPL. THE FUNCTION RECOMPL
APPENDS ITS ARGUMENT TO THE RECOMPL LIST. THE IDEA
IS THAT ONE CAN SPECIFY TO THE COMPILER WHICH FUNCTIONS
IN A FILE HAVE CHANGED, AND PRODUCE AN "UPDATE" FASL
FILE CONTAINING ONLY THE DIFFERENCES.
[0D] THE COMPILER NOW RECOGNIZES THE FORM (CGOL), AND
TREATS IT SOMEWHAT LIKE (DECLARE (EVAL (READ))) (CGOL).
[1] IF THE VARIABLE ZFUZZ IS NON-NIL, THEN PLUS AND DIFFERENCE
PERFORM A SPECIAL FUZZ CHECK ON FLOATING POINT NUMBERS.
IF A AND B ARE THE NUMBERS TO BE ADDED (POSSIBLY AFTER CONTAGIOUS
CONVERSION TO FLOATING POINT), THEN IF
A + B < B * ZFUZZ
THEN THE RESULT IS FORCED TO ZERO.
THIS HACK WAS INVENTED FOR BMT; IT MAY CHANGE IF HE DECIDES IT
ISN'T THE RIGHT THING.
[2] BEFORE PUTTING THE NEW PROPERTY ON AN ATOM, DEFPROP AND DEFUN
USED TO PERFORM A SINGLE REMPROP OF THE PROPERTY. NOW THEY LOOP,
REMOVING ALL INSTANCES OF THE PROPERTY FROM THE ATOM. THIS IS
TO ALLOW FOR TRACE, WHICH CREATES ATOMS WITH MULTIPLE OCCURRENCES
OF A GIVEN PROPERTY NAME.
[3] FOR THOSE WHO HACK LISP FROM DDT:
THE SYMBOL P% IS A PUSHJ INSTRUCTION SUITABLE FOR USE AS A DDT
USER TYPEOUT MODE (BY DEPOSITING IT INTO ..TAMPER OR SOME SIMILAR
LOCATION). IF WHEN THE LISP IS STARTED UP DDT HAS A SYMBOL TABLE
LOADED FOR THE LISP, LISP MOVES THE TYPEOUT MODE IN ..TAMPER
TO ..TPERCE, AND DEPOSITS P% IN ..TAMPER. IN THIS WAY THE DDT
COMMAND & MEANS LISP TYPEOUT MODE, AND SQUOZE TYPEOUT MAY BE DONE
VIA $%;.
THIS FORM OF LISP TYPEOUT MODE TYPES OUT $Q, NOT THE CONTENTS
OF . AS P.$X AND PL.$X DO. IF $Q HAS A NON-ZERO LEFT HALF,
THEN BOTH THE LEFT AND RIGHT HALVES ARE PRINTED AS S-EXPRESSIONS,
SEPARATED BY ",,". THIS TYPEOUT MODE IS USEFUL IN CONJUNCTION
WITH THE "RAID REGISTER" FEATURE OF DDT ($V).
REMEMBER, LETTERED ITEMS ARE FOR NEWIO ONLY!
[A] WHEN INPUTTING FROM A TTY USING THE TYI FUNCTION (AS OPPOSED TO
READ OR READLINE), NEWIO ARRANGES TO SET THE %TIACT BIT.
THE EFFECT OF THIS IS TO READ ANY CHARACTER IMMEDIATELY, EVEN
IF NO ACTIVATION CHARACTER HAS BEEN TYPED YET. THIS WILL
ALLEVIATE THE SCREW INVOLVING (STATUS TTY) FOR MOST PEOPLE.
[B] MANY PLACES IN NEWIO ARE NOW MUCH MORE CLEVER ABOUT UPDATING
THE CHARPOS AND LINENUM OF A TTY OUTPUT FILE WHEN INPUT HAS
BEEN DONE ON THE ASSOCIATED TTY. IN PARTICULAR, THE TYI
FUNCTION AND THE PRE-SCAN FUNCTION FOR READ BOTH UPDATE THINGS
CORRECTLY. THE VARIOUS DDT TYPEOUT HACKS ALSO ARRANGE TO
UPDATE THINGS CORRECTLY.
[C] THE VARIABLES TYI AND TYO NOW COME INITIALIZED RESPECTIVELY TO
THE INITIAL TTY INPUT AND OUTPUT FILE OBJECTS. T STILL WORKS
AS AN ARGUMENT TO MOST I/O FUNCTIONS, BUT TO AVOID AMBIGUITIES
USE THE OBJECTS IN TYI AND TYO. ALSO, SEVERAL PLACES IN NEWIO
WHICH USED TO SUPPLY A T FOR A FILE OBJECT NOW SUPPLY THE TTY
FILE OBJECT ITSELF, PARTICULARLY THE PLACE THAT SUPPLIES ARGUMENTS
TO INTERRUPT FUNCTION.
[D] NEWIO NOW UNDERSTANDS THAT IF THE VARIABLE READ IS NON-NIL IT IS
A USER READ FUNCTION. THE LOAD FUNCTION, WHEN LOADING AN EXPR FILE,
USES THIS USER READ FUNCTION ALSO.
[E] MORE FOR DDT HACKERS: SINCE THE ^H BREAK WAS RENAMED THE ^B BREAK
IN NEWIO, THE HH$X HACK IS CALLED BB$X IN NEWIO.
[F] IF AN INPUT TTY IS OPEN IN 12-BIT MODE, THE DEFAULT READ PRE-SCAN
FUNCTION TRIES TO THROW AWAY INTERRUPT CHARACTERS. THIS IS SO
THAT TOP CHARACTERS CAN GO THROUGH AS ALPHABETICS, WITHOUT LETTING
CONTROL CHARACTERS CONFUSE THE READER.
IT HAS ALWAYS BEEN TRUE THAT IF A TTY INPUT INTERRUPT FUNCTION WAS
REALLY A NUMBER, THEN IT MEANT THAT THE "INTERNAL" INTERRUPT
ACTION SPECIFIED BY THAT NUMBER WAS TO BE TAKEN; FURTHERMORE,
IF THE 200 OR 400 BIT WAS SET IN THE NUMBER, THE CTRL OR META
BIT WAS REQUIRED TO BE PRESENT IN THE TYPED CHARACTER (THIS
WAS SO THAT CTRL/G WOULD QUIT BUT "PI" WOULD NOT, FOR INSTANCE).
A NEW TWIST IS THAT THE 200000000 AND 400000000 (200 AND 400 IN THE
LEFT HALF) BITS REQUIRE THE ABSENCE OF THE CTRL AND META BITS
IN THE TYPED CHARACTER FOR THE INTERRUPT ACTION TO TAKE PLACE.
THUS, FOR EXAMPLE:
(SSTATUS TTYINT 7 207) ;CTRL/G AND META/CTRL/G QUIT
(SSTATUS TTYINT 7 607) ;ONLY META/CTRL/G QUITS
(SSTATUS TTYINT 7 400000207) ;CTRL/G QUITS, BUT NOT META/CTRL/G
(SSTATUS TTYINT 600000007) ;"PI" QUITS, BUT NOT CTRL/G OR META/CTRL/G
[G] MAR INTERRUPT FEATURE
AT LONG LAST, THE MAR BREAK IS AVAILABLE TO THE LISP USER!
THIS IS A FEATURE WHICH DETECTS WHEN A GIVEN MEMORY LOCATION IS
REFERENCED AND GIVES AN INTERRUPT.
[F1] THE VARIABLE MAR-BREAK, IF NON-NIL, IS A USER INTERRUPT
FUNCTION WHICH IS CALLED WHEN THE MAR BREAK IS FIRED.
IT TAKES ONE ARGUMENT WHICH PRESENTLY IS ALWAYS NIL.
[F2] (STATUS MAR) AND (SSTATUS MAR)
TO "ARM" THE MAR BREAK, IT IS NECESSARY TO SAY
(SSTATUS MAR N LOC)
WHERE N CONTROLS WHEN THE MAR IS FIRED, AND LOC IS
THE PLACE TO MONITOR. N MAY TAKE ON THE FOLLOWING VALUES:
0 TURN OFF THE MAR FEATURE
1 BREAK ON INSTRUCTION FETCH
2 BREAK ON WRITE
3 BREAK ON ALL REFERENCES
ON THE KL-10, THESE ADDITIONAL VALUES ARE REPUTED TO WORK:
10 BREAK ON DATA READ
11 BREAK ON READ AND FETCH
12 BREAK ON READ AND WRITE, BUT NOT FETCH
13 BREAK ON FETCH AND WRITE, BUT NOT READ
THE 4 BIT (EXEC VS. USER MODE) IS IGNORED (USER IS FORCED).
LOC IS ANY S-EXPRESSION; THAT CELL IS THE ONE MONITORED.
THUS (SETQ FOO (LIST 'A 'B)) (SSTATUS MAR 2 FOO)
WILL TRIP THE MAR BREAK IF THE LIST CELL IN FOO IS EVER
RPLACA'D OR RPLACD'D. AS AN EXAMPLE:
(DEFUN MAR-TRACER (X)
(TERPRI)
(PRINC '|NOW THE VARIABLE |)
(PRIN1 THE-MAR-VARIABLE)
(PRINC '| HAS THE VALUE |)
(PRIN1 (SYMEVAL THE-MAR-VARIABLE))
(SSTATUS MAR 2 (GET THE-MAR-VARIABLE 'VALUE)))
(SETQ MAR-BREAK 'MAR-TRACER)
(DEFUN MAR FEXPR (X)
(SETQ THE-MAR-VARIABLE (CAR X))
;; MAKE SURE THE VARIABLE HAS A VALUE CELL
(COND ((NOT (BOUNDP THE-MAR-VARIABLE))
(SET THE-MAR-VARIABLE NIL)))
(SSTATUS MAR 2 (GET THE-MAR-VARIABLE 'VALUE)))
(DEFUN UNMAR () (SSTATUS MAR 0 NIL))
(MAR QUUX)
(SETQ QUUX 5)
NOW QUUX HAS THE VALUE 5
(DO ((QUUX 0 (+ QUUX 1))) ((= QUUX 2)) (HACK QUUX))
NOW QUUX HAS THE VALUE 0
NOW QUUX HAS THE VALUE 1
NOW QUUX HAS THE VALUE 2
NOW QUUX HAS THE VALUE 5
NIL
(STATUS MAR) RETURNS A 2-LIST DESCRIBING THE CURRENT STATE
OF THE MAR, OR NIL IF THE MAR IS NOT IN USE. NOTE THAT
USING THE MAR FROM DDT WILL NOT CONFUSE LISP, AND LISP
TRIES NOT TO CONFUSE DDT. IF LISP IS NOT USING THE MAR,
THEN IT DOESN'T EVEN TAKE THE MAR INTERRUPT FROM ITS,
AND SO DDT CAN TRAP IT.
[F3] THE SUSPEND FUNCTION DOES ITS BEST TO SAVE AND RESTORE
THE STATE OF THE MAR.
[F4] WHEN A ^G FORCES A QUIT BACK TO TOP LEVEL, THE MAR BREAK
IS DISABLED DURING THE UNBINDING OF VARIABLES, AND
RE-ENABLED AFTERWARDS. THIS IS BECAUSE DURING A QUIT
LISP IS NOT IN A GOOD STATE FOR RUNNING USER INTERRUPTS.
[H] OTHER NEW USER INTERRUPTS
[G1] TTY-RETURN, IF NON-NIL, IS A USER INTERRUPT FUNCTION
WHICH IS RUN WHENEVER THE TTY IS GIVEN TO THE LISP JOB.
(THIS IS DRIVEN BY THE %PIATY BIT IN ITS.)
THIS IS USEFUL FOR TELLING LISP THAT SOME OTHER JOB
MAY HAVE MESSED UP THE SCREEN DISPLAY.
THE ARGUMENT TO THE FUNCTION IS PRESENTLY ALWAYS NIL.
[G2] SYS-DEATH, IF NON-NIL, IS A USER INTERRUPT FUNCTION
WHICH IS RUN WHENEVER THE STATE OF THE SYSTEM IS GOING
DOWN, BEING REVIVED, OR BEGIN DEBUGGED.
(THIS IS DRIVEN BY THE %PIDWN AND %PIDBG BITS IN ITS.)
THE ARGUMENT TO THE FUNCTION IS PRESENTLY ALWAYS NIL.
USEFUL IN CONJUNCTION WITH THIS INTERRUPT IS (STATUS ITS).
THIS RETURNS A LIST OF FIVE NUMBERS:
(1) THE TIME, IN SECONDS, UNTIL THE SYSTEM GOES DOWN,
AS A FLONUM, -1.0 IF THE SYSTEM DOES NOT PLAN
TO GO DOWN, OR -2.0 IF THE SYSTEM IS ALREADY DOWN.
(2) A FIXNUM, NON-ZERO IF THE SYSTEM IS BEING DEBUGGED.
(3) THE NUMBER OF USERS ON THE SYSTEM, AS A FIXNUM.
(4) THE NUMBER OF MEMORY ERRORS THE SYSTEM HAS SURVIVED.
(5) THE TIME IN SECONDS THE SYSTEM HAS BEEN UP,
AS A FLONUM.
THIS INFORMATION COMES FROM THE ITS "SSTATU" SYSTEM CALL.
[G3] MACHINE-ERROR, IF NON-NIL, IS A USER INTERRUPT FUNCTION
WHICH IS RUN WHENEVER A MEMORY PROTECTION VIOLATION,
WRITE INTO READ-ONLY MEMORY, ILLEGAL OPERATION, OR
PARITY ERROR OCCURS. THE FUNCTION RECEIVES TWO ARGUMENTS:
THE FIRST IS THE PROGRAM COUNTER WHEN THE ERROR OCCURRED
(NOT THE MEMORY LOCATION OF THE ERROR!), AND THE SECOND
IS A SYMBOL DESCRIBING THE TYPE OF ERROR:
EXAMINE ATTEMPT TO REFERENCE NON-EXISTENT MEMORY
DEPOSIT WRITE INTO READ-ONLY MEMORY
EVAL ILLEGAL OPERATION
ODDP PARITY ERROR
NOTE THAT THE LISP SYSTEM MAY INTERCEPT SOME OCCURRENCES
OF THESE ERRORS, SINCE THEY CAN BE USED FOR VARIOUS
SHARED-MEMORY HACKS.
IF THE USER INTERRUPT FUNCTION EVER RETURNS, THE PROGRAM
IS RESUMED AT THE PROGRAM COUNTER AS OF THE ERROR;
THAT IS, THE ERRONEOUS OPERATION IS RETRIED. BEWARE
OF LOOPS! IT IS EXPECTED THAT THE INTERRUPT FUNCTION WILL
NORMALLY ERROR OUT.
IF NO USER INTERRUPT FUNCTION IS SUPPLIED, LISP WILL
BEHAVE AS IT ALWAYS HAS, AND ERROR OUT TO TOP LEVEL.
THE NEXT FEATURE IS AVAILABLE IN ALL BIBOP LISPS, WHETHER OLDIO OR NEWIO.
[4] HUNKS PACKAGE
THE HUNKS PACKAGE PROVIDES LISP WITH A KIND OF "RECORD" OR
"SMALL VECTOR" FEATURE. THE HUNK DATA TYPE INTERACTS SMOOTHLY
WITH THE LIST DATA TYPE TO PROVIDE SOME INTERESTING CAPABILITIES.
[5A] A NEW DATA TYPE IS INTRODUCED INTO LISP, THE "HUNK".
HUNKS ARE SHORT VECTORS OF S-EXPRESSIONS. IN THE CURRENT
IMPLEMENTATION THERE ARE ACTUALLY SEVERAL SPACES OF
FOR HUNKS, VARIOUSLY CALLED HUNK4, HUNK8, HUNK16, ETC.
THESE WILL BE EXPLAINED IN DETAIL BELOW. IN SOME
CONTEXTS ORDINARY LIST CELLS ARE CONSIDERED TO BE HUNKS
OF LENGTH 2. HUNKS ARE NOT CONSIDERED TO BE ATOMS;
(ATOM H) RETURNS NIL FOR ANY HUNK H.
[5B] (HUNKP X) IS A PREDICATE WHICH RETURNS T IFF X IS A HUNK.
IN THIS CONTEXT A LIST CELL IS NOT CONSIDERED TO BE A HUNK.
(CXR N H) RETURNS THE N'TH ELEMENT OF THE HUNK H.
(CXR 0 H) IS EQUIVALENT TO (CAR H), AND (CXR 1 H)
IS EQUIVALENT TO (CDR H); IN FACT, THE CAR AND CDR
FUNCTIONS MAY BE USED ON HUNKS AS WELL AS ON LISTS.
(RPLACX N H Z) REPLACES THE N'TH COMPONENT OF H WITH Z.
THE VALUE OF RPLACX IS ITS (MODIFIED) SECOND ARGUMENT.
THUS (RPLACX 0 H Z) IS EQUIVALENT TO (RPLACA H Z),
AND (RPLACX 1 H Z) IS EQUIVALENT TO (RPLACD H Z).
(HUNK N) CREATES A HUNK OF SIZE N AND RETURNS IT.
(HUNK 0) RETURNS NIL, AND (HUNK 1) OR (HUNK 2)
RETURNS A LIST CELL. ALL COMPONENTS ARE INITIALIZED
TO NIL. THE COMPONENTS ARE NUMBERED FROM 0 TO N-1.
(HUNKIFY A0 A2 ... AN-1) IS EQUIVALENT TO
((LAMBDA (H)
(RPLACX 0 A0)
...
(RPLACX N-1 AN-1))
(HUNK N))
THAT IS, IT CREATES A HUNK WHOSE COMPONENTS ARE THE
ARGUMENTS TO HUNKIFY. NOTE THAT, AS FUNNY BOUNDARY
CASES, (HUNKIFY) RETURNS NIL, AND (HUNKIFY X)
IS THE SAME AS (NCONS X).
(HUNKSIZE H) RETURNS THE NUMBER OF COMPONENTS IN
THE HUNK H. HUNKSIZE OF A LIST CELL IS 2; HUNKSIZE
OF NIL IS 0.
[5C] EQUAL WILL COMPARE HUNKS BY DOING A RECURSIVE
COMPONENT BY COMPONENT COMPARISON. SXHASH WILL
COMPUTE THE HASH ON THE BASIS OF ALL COMPONENTS.
[5D] HUNKS ARE PRINTED USING AN EXTENSION TO DOT NOTATION
SUGGESTED BY RMS. SINCE LIST CELLS ARE CONSIDERED TO
BE 2-HUNKS, AND ARE PRINTED AS (CAR . CDR), THE RESULT
OF (HUNKIFY A0 A1 A2 +++ AN-2 AN-1) IS PRINTED AS
(A0 . A2 . A3 . +++ . AN-2 . AN-1 . A1), WHERE "+++"
IS USED AS AN ELLIPSIS TO AVOID CONFUSION WITH THE
DOT NOTATION. THUS WE HAVE:
(HUNKIFY 0) => (0)
(HUNKIFY 0 1) => (0 . 1)
(HUNKIFY 0 1 2) => (0 . 2 . 1)
(HUNKIFY 0 1 2 3) => (0 . 2 . 3 . 1)
THE REASON FOR THE STRANGE PLACEMENT OF A1 IS SO THAT
THE CDR WILL BE LAST. THIS MAY SEEM RATHER KLUDGY, BUT
ACTUALLY LENDS ITSELF TO CERTAIN ELEGANT EXTENSIONS.
ONE IS A GENERAL EXTENSION OF THIS DOT NOTATION TO LIST
NOTATION. AS AN EXAMPLE, CONSIDER:
(A B . C . D E . F G H I . J . K)
THIS IS HOW PRINT WOULD REPRESENT THE RESULT OF:
(HUNKIFY 'A
(HUNKIFY 'B
(HUNKIFY 'E
(HUNKIFY 'G
(HUNKIFY 'H
(HUNKIFY 'I
'K
'J)))
'F)
'C
'D))
THE BASIC IDEA IS THAT CONSECUTIVE ITEMS SEPARATED BY DOTS
ALL BELONG TO THE SAME HUNK; ITEMS SEPARATED ONLY BY SPACES
BELONG TO DIFFERENT HUNKS, AND THE SECOND HUNK IS THE CDR
(I.E. THE (CXR 1)) OF THE FIRST HUNK. ANOTHER WAY TO THINK
ABOUT IT IS TO REPLACE THE TWO PARENS BY SUPER-BRACKETS,
AND THEN BETWEEN TWO ITEMS SEPARATED BY SPACE BUT NOT DOT
INSERT ".(". NOTE THAT THE DEFINITION OF (HUNKIFY X)
AS (NCONS X) CAUSES THE BOUNDARY CONDITION AT THE END OF
THE LIST TO WIN.
AS A SPECIAL CASE, IF THE CDR OF A HUNK (OTHER THAN A LIST
CELL) IS NIL, THAT NIL MAY BE ELIDED (BUT THE PRECEDING DOT
MAY NOT BE ELIDED!). THUS:
(HUNKIFY 1 (HUNKIFY 2 NIL 3 4) 5) => (1 . 5 2 . 3 . 4 .)
(HUNKIFY 'A
(HUNKIFY 'B
(HUNKIFY 'C
NIL
'D)
'E)
'F) => (A . F B . E C . D .)
MAYBE EVENTUALLY READ WILL KNOW HOW TO READ THESE IN.
[5E] MOST OTHER FUNCTIONS WHICH OPERATE ON LIST STRUCTURE
WILL TREAT HUNKS AS LIST CELLS, USING ONLY THE FIRST
TWO POINTERS. (IN PARTICULAR, SUBST AND SUBLIS DO
NOT PRESENTLY KNOW ANYTHING SPECIAL ABOUT HUNKS;
HENCE (SUBST NIL NIL H) WILL NOT COPY A HUNK!)
EVAL ALSO TREATS HUNKS AS LIST CELLS; THUS THE EXPRESSION
(PLUS . FIXNUM . SIMP 1 2 3)
EVALUATES TO 6, IGNORING "FIXNUM" AND "SIMP".
IMAGINE THE POSSIBILITIES FOR HACKING!
[5F] (STATUS FEATURE HUNK) IS NON-NIL IFF LISP HAS THE HUNK STUFF.
[5G] (STATUS SPCNAMES) WILL INCLUDE THE NAMES OF ALL THE ACTUAL
SPACES. IN THE CURRENT IMPLEMENTATION HUNKS HAVE SPACES
FOR HUNKS OF VARIOUS POWERS OF TWO IN SIZE, NAMELY 4., 8.,
16., ... UP TO SOME LIMIT (PROBABLY 16., THOUGH IT IS AN
ASSEMBLY PARAMETER I CAN CHANGE IF ANYONE NEEDS IT).
A HUNK OF 11. POINTERS IS MADE USING ONE OF 16. POINTERS
AND MARKING 5. OF THEM AS UNUSED. IT IS PROBABLY NOT
A GOOD IDEA TO DEPEND ON THIS IMPLEMENTATION, AS ONE CAN
IMAGINE MORE HACKISH IMPLEMENTATIONS (BUDDY BLOCK, ETC.).
[5H] (STATUS GCSIZE), (STATUS GCMAX), (ALLOC T), AND SIMILAR
HACKS ALL KNOW ABOUT THE SPACE NAMES FOR HUNKS AS
RETURNED BY (STATUS SPCNAMES).
THIS LAST MESS IS IN NEWIO ONLY!
[I] HUMBLE PACKAGE FOR HACKING INFERIOR JOBS ON ITS
LIBLSP;HUMBLE FASL CONTAINS A COLLECTION OF PRIMITIVES FOR
HACKING INFERIOR JOBS FROM LISP. SOME LESS PRIMITIVE PACKAGES
WHICH USE HUMBLE ALSO EXIST; JLK IS A GOOD PERSON TO ASK.
[I1] THE FOLLOWING SPECIAL VARIABLES ARE SACRED TO HUMBLE:
CURRENT-JOB
THE-JOB-INPUT-CHANNEL
THE-JOB-OUTPUT-CHANNEL
THE-JOB-INPUT-CHANNEL-FILE-OBJECT
THE-JOB-OUTPUT-CHANNEL-FILE-OBJECT
THE USER OF HUMBLE NEED CONCERN HIMSELF ONLY WITH
CURRENT-JOB. IF NON-NIL, THIS IS THE JOB OBJECT FOR
THE CURRENT JOB. HUMBLE USES TWO I/O CHANNELS, WHICH
ARE USED TO SERVE THE CURRENT JOB.
JOB OBJECTS ARE SIMILAR TO NEWIO FILE OBJECTS. THEIR
FORMAT IS DOCUMENTED (AND SYMBOLS DEFINED) IN LISP;DEFNS >.
HUMBLE AND LISP MAINTAIN INTERNALLY A TABLE OF JOB OBJECTS
(KEPT AT LOCATION JOBTB). IF A JOB OBJECT IS EVER GARBAGE
COLLECTED, GC PRINTS A MESSAGE AND .UCLOSE'S THE JOB.
[I2] (CREATE-JOB <JOBINTFN> <CHNINTFN> <JNAME> <UNAME> <FOREIGN>)
CREATES A JOB OBJECT, AND MAKES IT CURRENT.
<JOBINTFN> AND <CHNINTFN> ARE THE INTERRUPT FUNCTIONS
TO BE USED IF AN INTERRUPT IS RECEIVED ON THE INFERIOR
OR ON THE I/O CHANNELS USED TO SERVICE INFERIORS,
RESPECTIVELY. THEY RECEIVE ONE ARGUMENT, THE JOB
OBJECT OR FILE OBJECT ASSOCIATED WITH THE INTERRUPT.
<UNAME> AND <FOREIGN> ARE OPTIONAL ARGUMENTS.
<UNAME> = NIL (DEFAULT) MEANS YOUR UNAME.
<FOREIGN> = T (NON-DEFAULT) MEANS REQUIRE FOREIGN JOB.
CREATE-JOB RETURNS A LIST OF TWO THINGS:
(1) ONE OF THE FOLLOWING ATOMS:
INFERIOR, REOWNED, FOREIGN
(2) THE NEWLY CREATED JOB OBJECT
IF <FOREIGN> WAS NON-NIL AND THE JOB WAS NOT FOUND,
NIL IS RETURNED.
[I3] (SELECT-JOB <JOB>) MAKES THE SPECIFIED JOB CURRENT IN THE
EXPECTED MODE (FOREIGN OR NOT), RETURNING VALUES AS FOR
CREATE-JOB.
[I4] (KILL-JOB) KILLS THE CURRENT JOB.
[I5] (LOAD-JOB <FILENAME>) OPENS UP FILE <FILENAME> (SPECIFIED
AS A NEWIO NAMELIST OR NAMESTRING) AND LOADS IT INTO TH
CURRENT JOB AS A BINARY PROGRAM (USES THE LOAD SYSTEM CALL).
RETURNS:
NIL WON!
BIN? FILE NOT BIN
FILE? FILE NOT FOUND
[I6] (JOB-USET-READ <NUM>) RETURNS VALUE OF USET VAR <NUM>,
OR NIL IF NO CURRENT JOB.
(JOB-USET-WRITE <NUM> <VAL>) WRITES USET VAR <NUM>,
THEN RETURNS T FOR SUCCESS OR NIL IF NO CURRENT JOB OR THE
CURRENT JOB IS FOREIGN. <NUM> SHOULD HAVE THE 400000 BIT SET.
[I7] (EXAMINE-JOB <LOC>) EXAMINES LOCATION <LOC> OF CURRENT JOB.
RETURNS NIL ON FAILURE (INDICATES BAD ERROR).
(DEPOSIT-JOB <LOC> <VAL>) DEPOSITS <VAL> IN <LOC> OF CURRENT JOB.
RETURNS NIL ON FAILURE (INDICATES BAD ERROR).
[I8] (*ATTY) DOES A .ATTY TO THE CURRENT JOB; (*DTTY) DOES A .DTTY.
BOTH RETURN T FOR SUCCESS AND NIL FOR FAILURE.
[I9] THERE EXIST PACKAGES OF MACROS AND HIGHER-LEVEL FUNCTIONS
FOR HACKING INFERIOR JOBS. SEE JLK OR RZ FOR IDEAS.