TUESDAY  APRIL 23,1974   NM+2D.8H.36M.6S.    LISP 810    - GLS -

BRIEF SYNOPSIS:
[1] NEW FUNCTION: GETCHARN
[2] ALARMCLOCK AND TTY INTERRUPTS ARE RUN WITH (NOINTERRUPT T)
[3] NEW ARRAY SCHEME
[4] NEW FUNCTIONS: SUBRCALL, LSUBRCALL, ARRAYCALL
[5] UUO'S CHANGED: LER2,LER4 GONE; LER3 MOVED; ACALL,AJCALL NEW
[6] HH$X SLIGHTLY IMPROVED
----------------------------------------------------------------
[1] NEW FUNCTION: GETCHARN IS LIKE GETCHAR, BUT RETURNS A
    NUMBER INSTEAD OF A SINGLE CHARACTER OBJECT.  IT IS
    TO GETCHAR AS EXPLODEN IS TO EXPLODEC, AND IS SIMILAR IN ACTION 
    TO (LAMBDA (X) (CAR (EXPLODEN X))).  EXAMPLES:
	(GETCHARN 'FOOBAR 1) => 106	;OCTAL
	(GETCHARN 'FOOBAR 4) => 102
	(GETCHARN 'FOOBAR -1) => 0
	(GETCHARN 'FOOBAR 77) => 0

[2] WHEN AN ALARMCLOCK OR TTY INTERRUPT HAPPENS, THE NOINTERRUPT 
    FLAG IS SAVED, (NOINTERRUPT T) IS PERFORMED, THE USER'S SERVICE 
    FUNCTION IS EXECUTED, AND THE NOINTERRUPT FLAG IS RESTORED AFTER 
    EXECUTION.  [THE FLAG MIGHT CONCEIVABLY BE ON IF (IOC <X>) WERE 
    USED TO INITIATE THE INTERRUPT - NOINTERRUPT ONLY LOCKS OUT 
    REAL-TIME EVENTS.]  THUS, AN ALARMCLOCK HANDLER, FOR EXAMPLE, 
    WONT BE ABORTED BY A RANDOM ^G BEFORE IT HAS HAD A CHANCE TO 
    RESTART THE CLOCK.

[3] THE NEW ARRAY SCHEME IS WORKING WELL NOW FROM THE INTERPRETER
    SIDE; THE NCOMPLR WILL KNOW ABOUT IT WHEN THE NEXT VERSION
    IS AVAILABLE, AND COMPLR WILL FOLLOW SUIT SHORTLY THEREAFTER.
    THE LISP NEW-ARRAY SCHEME COMPRISES MANY CHANGES TO THE 
    ARRAY PACKAGE, MOST OF WHICH ARE EXTENSIONS;  THERE
    ARE FEW INCOMPATIBILITIES. THE MOST IMPORTANT EXTENSION IS
    THE ADDITION OF TWO NEW TYPES OF ARRAYS: FIXNUM AND FLONUM.
    THESE TYPES OF ARRAYS STORE THEIR ELEMENTS AS 36-BIT WORDS
    RATHER THAN AS 18-BIT POINTERS, THUS SAVING SPACE AND TIME.
    SHORTLY, BOTH COMPLR AND NCOMPLR WILL PRODUCE CODE FOR ARRAYS 
    THAT WILL OPEN-ACCESS BOTH STANDARD AND FULLWORD ARRAYS ALMOST 
    AS FAST AS FORTRAN-COMPILED CODE DOES.
        ONE SOMEWHAT DRASTIC CHANGE: NSTORE WILL GO AWAY, SINCE 
    FIXNUM ARRAYS CAN BE USED WHERE AN ARRAY OF NUMBERS IS DESIRED. 
    FUNCTIONS SUCH AS LOADARRAYS AND DISGORGE WILL BE MODIFIED TO 
    USE FIXNUM ARRAYS RATHER THAN S-EXPRESSION-WITHOUT-GC-PROTECTION 
    ARRAYS.  IT IS POSSIBLE THAT SOMETIME IN THE FUTURE THERE MAY BE 
    OTHER VERSIONS OF THE FIXNUM-ARRAY IDEA, IN WHICH THE USER 
    SPECIFIES THE NUMBER OF BITS FOR EACH ENTRY;  THUS AN ARRAY 
    OF 1-BIT BYTES COULD EFFECT A SAVINGS OF A FACTOR OF 36.  BUT 
    THIS IS ONLY A POSSIBILITY FOR THE FUTURE.  OTHER CHANGES AND 
    EXTENSIONS ARE DESCRIBED BELOW ON A FUNCTION-BY-FUNCTION BASIS:

(*ARRAY <ARRAY> <TYPE> <DIM1> ... <DIMN>)	;LSUBR (2 . 7)

    CREATES AN N-DIMENSIONAL ARRAY. <TYPE> SPECIFIES THE TYPE
    OF THE ARRAY TO BE CREATED:

		T		S-EXPRESSION (AS BEFORE)
		NIL		S-EXPRESSION (BUT NO GC PROTECTION)
		FIXNUM		CONTAINS FIXNUMS AS 36-BIT WORDS
		FLONUM		CONTAINS FLONUMS AS 36-BIT WORDS
		OBARRAY		OBARRAY
		READTABLE	READTABLE

    IF <ARRAY> IS NIL, THEN AN ARRAY OF THE SPECIFIED TYPE,
    DIMENSIONALITY, AND SIZE IS CREATED, AND A FRESH ARRAY
    POINTER IS CONSED UP AND RETURNED; THE LATTER IS AN
    OBJECT WHICH POINTS TO THE BODY OF THE ARRAY.
    TYPEP OF SUCH AN OBJECT RETURNS "ARRAY". SUCH OBJECTS
    ARE ALSO THE RESULT OF SAYING (GET 'FOO 'ARRAY), AND
    ARE THE VALUE OF ATOMIC SYMBOLS LIKE OBARRAY AND READTABLE.
    ARRAY POINTERS MAY BE GIVEN TO APPLY AND FUNCALL; THUS
    (READTABLE 10) IS THE 10'TH ENTRY OF THE INITIAL READTABLE,
    THAT IS, OF THE ARRAY UNDER READTABLE'S ARRAY PROPERTY; BUT
    (FUNCALL READTABLE 10) IS THE 10'TH ENTRY OF THE CURRENT
    READTABLE, THAT IS, THE ARRAY POINTER WHICH IS THE VALUE
    OF THE VARIABLE "READTABLE". IN GENERAL, ARRAY POINTERS
    MAY BE USED IN ALMOST ANY PLACE (ALMOST!) THAT AN ATOMIC
    SYMBOL WITH AN ARRAY PROPERTY MAY BE USED. THERE IS A PLACE
    WHERE ARRAY POINTERS MUST BE USED IN PREFERENCE TO ATOMIC
    SYMBOLS WITH ARRAY PROPERTIES: SEE THE NEW "ARRAYCALL"
    FUNCTION BELOW. IN GENERAL, THE USER CANNOT MANIPULATE
    ARRAYS DIRECTLY, BUT ONLY THROUGH ARRAY POINTERS; THIS
    IS BECAUSE ARRAYS MAY BE RELOCATED WITHOUT WARNING BY
    THE GARBAGE COLLECTOR. FURTHERMORE, NO TWO NON-EQ ARRAY 
    POINTERS CAN EVER POINT TO THE SAME ARRAY.
    IF <ARRAY> IS NON-NIL, THEN IT MUST BE EITHER AN ARRAY
    POINTER OR AN ATOMIC SYMBOL. IF IT IS A SYMBOL, AND THE
    SYMBOL HAS NO ARRAY PROPERTY, IT IS GIVEN ONE (A FRESH
    ARRAY POINTER IS CONSED UP FOR THIS PURPOSE). IF <ARRAY>
    IS AN ARRAY POINTER, OR A SYMBOL WITH AN ARRAY PROPERTY,
    THEN ANY ARRAY CURRENTLY POINTED TO BY THAT POINTER IS
    KILLED. IN ANY CASE THE ARRAY POINTER IS THEN MADE TO
    POINT TO THE NEWLY CREATED ARRAY.
    AN ARRAY MAY BE UP TO FIVE-DIMENSIONAL (FORMERLY ONLY FOUR
    DIMENSIONS WERE ALLOWED). IF <DIMX> IS SPECIFIED AS JX,
    THEN THE X'TH SUBSCRIPT VARIES FROM 0 TO JX-1, AS BEFORE.
    AN ARRAY IS EFFECTIVELY A FUNCTION; THUS IF FOO HAS AN
    ARRAY PROPERTY, THEN (FOO 1 3) RETURNS ELEMENT [1,3] OF THE
    ARRAY FOO (WHICH BETTER BE TWO-DIMENSIONAL!)
    WHEN A NEW ARRAY IS CREATED, ITS ENTRIES ARE INITIALIZED TO
    NIL FOR ARRAYS OF TYPE "T" OR "NIL", TO 0 FOR FIXNUM ARRAYS,
    OR TO 0.0 FOR FLONUM ARRAYS. TO INITIALIZE AN ARRAY TO OTHER
    VALUES, SEE THE FUNCTIONS *REARRAY, BLTARRAY, AND FILLARRAY
    BELOW.
    IF <TYPE> IS OBARRAY OR READTABLE, THEN THE EXTRA ARGUMENTS
    HAVE A SLIGHTLY DIFFERENT SIGNIFICANCE. ONLY TWO OR THREE
    ARGUMENTS IN ALL MAY BE GIVEN; THE THIRD, IF PRESENT, TELLS
    HOW TO INITIALIZE THE OBARRAY OR READTABLE.
    FOR AN OBARRAY, A THIRD ARGUMENT OF NIL MEANS THAT THE NEW
    OBARRAY SHOULD BE LEFT COMPLETELY EMPTY. A THIRD ARGUMENT
    OF T MEANS THAT THE NEW ARGUMENT SHOULD BE INITIALIZED FROM
    THE CURRENT OBARRAY (THAT IS, FROM WHATEVER ARRAY POINTER IS
    THE CURRENT VALUE OF THE VARIABLE "OBARRAY"). ANY OTHER
    THIRD ARGUMENT MUST BE AN ARRAY OF TYPE OBARRAY FROM WHICH
    TO INITIALIZE THE NEW OBARRAY. OMITTING THE THIRD ARGUMENT
    IS THE SAME AS SAYING T. NOTE THAT WHEN ONE OBARRAY IS
    INITIALIZED FROM ANOTHER, THE BUCKETS ARE COPIED, BUT
    THE ATOMIC SYMBOLS ARE NOT COPIED.
    FOR A READTABLE, A THIRD ARGUMENT OF NIL MEANS THAT THE NEW
    READTABLE SHOULD BE INITIALIZED FROM THE CURRENT READTABLE.
    A THIRD ARGUMENT OF T MEANS TO INITIALIZE FROM THE SYSTEM'S
    INITIAL READTABLE. ANY OTHER THIRD ARGUMENT MUST BE A
    READTABLE TO INITIALIZE FROM. (IT MAKES NO SENSE TO HAVE AN
    "EMPTY" READTABLE AS IT DOES FOR AN OBARRAY). OMITTING THE
    THIRD ARGUMENT IS THE SAME AS SAYING NIL.

    EXAMPLES:
	(*ARRAY 'FOO 'FIXNUM 3 4 5)	;FOO GETS AN ARRAY
					; PROPERTY FOR A
					; 3X4X5 ARRAY OF FIXNUMS
	(*ARRAY NIL T 4 4)		;RETURNS ARRAY POINTER
					; FOR A 4X4 ARRAY OF
					; ARBITRARY S-EXPRESSIONS
	(*ARRAY 'QUUX 'READTABLE)	;QUUX IS GIVEN AN ARRAY
					; PROPERTY FOR A
					; READTABLE, INITIALIZED
					; FROM CURRENT ONE

(ARRAY <<ARRAY> <TYPE> <DIM1> ... <DIMN>)		;FSUBR

    ARRAY IS THE SAME AS *ARRAY, EXCEPT THAT THE FIRST TWO
    ARGUMENTS ARE NOT EVALUATED. THUS THE EXAMPLES ABOVE COULD
    HAVE BEEN WRITTEN:
	(ARRAY FOO FIXNUM 3 4 5)
	(ARRAY NIL T 4 4)
	(ARRAY QUUX READTABLE)

(STORE <ARRAY CALL> <VALUE>)			;FSUBR

    THIS WORKS AS BEFORE: IT STORES THE GIVEN VALUE IN THE
    SPECIFIED ARRAY ELEMENT. IF <ARRAY CALL> IS A CALL TO
    A FIXNUM OR FLONUM ARRAY, THEN <VALUE> SHOULD BE A FIXNUM
    OR FLONUM, RESPECTIVELY. RECALL THAT STORE EVALUATES ITS
    SECOND ARGUMENT BEFORE THE FIRST ARGUMENT; THUS
	(SETQ J 3)
	(STORE (FOOARRAY (SETQ J 5)) J)
    WILL STORE 3, NOT 5, IN ELEMENT 5 OF FOOARRAY. ONE SHOULD AVOID
    DEPENDING ON THIS FACT, HOWEVER, IN THE INTERESTS OF CLARITY.
    SEE ALSO THE DESCRIPTION OF THE NEW "ARRAYCALL" FUNCTION BELOW.

(ARRAYDIMS <ARRAY>)				;SUBR 1

    THIS FUNCTION WORKS AS BEFORE, BUT CAN RETURN A BROADER
    RANGE OF VALUES. IT RETURNS A LIST, SUCH THAT THE CAR
    OF THE LIST IS THE TYPE OF THE ARRAY (I.E., T, NIL,
    FIXNUM, FLONUM, OBARRAY, OR READTABLE), AND THE CDR IS
    A LIST OF ARRAY DIMENSIONS. THUS:
	(ARRAY QUUX FIXNUM 3 4 5)
	(ARRAYDIMS 'QUUX) => (FIXNUM 3 4 5)
	(ARRAYDIMS (GET 'QUUX 'ARRAY)) => (FIXNUM 3 4 5)
	(ARRAY ZORCH OBARRAY)
	(ARRAYDIMS 'ZORCH) => (OBARRAY 777)
    WHERE 777 HAPPENS TO BE THE SIZE OF AN OBARRAY ON THIS
    GIVEN LISP SYSTEM (THIS VARIES FROM ONE LISP TO ANOTHER).
    NOTE THAT ARRAYDIMS RETURNS SLIGHTLY DIFFERENT VALUES FOR
    READTABLES AND OBARRAYS THAN IT USED TO.

(*REARRAY <ARRAY> <TYPE> <DIM1> ... <DIMN>)	;LSUBR (1 . 7)

    THIS FUNCTION WORKS PRETTY MUCH AS BEFORE.
    IF IT IS GIVEN ONLY ONE ARGUMENT (*REARRAY FOO), THEN FOO
    MAY BE AN ARRAY POINTER OR AN ATOMIC SYMBOL. IF IT IS AN
    ATOMIC SYMBOL WITH NO ARRAY PROPERTY, IT MERELY RETURNS.
    OTHERWISE IT KILLS THE ARRAY POINTED TO BY THE ARRAY POINTER
    (THE ONE GIVEN, OR THE ONE OBTAINED FROM THE SYMBOL'S
    PROPERTY LIST). THE ARRAY POINTER IS NOW "DEAD", AND CANNOT
    BE USED AS A FUNCTION UNLESS AND UNTIL IT IS GIVEN A NEW
    ARRAY TO POINT TO.
    IF MORE THAN ONE ARGUMENT IS GIVEN TO *REARRAY, THEN THEY
    SHOULD BE ARGUMENTS SIMILAR TO THOSE FOR *ARRAY, EXCEPT THAT
    THE FIRST ARGUMENT MUST ALREADY BE A LIVE ARRAY, EITHER AS
    AN ARRAY POINTER OR AS A SYMBOL WITH A LIVE ARRAY PROPERTY.
    *REARRAY EFFECTIVELY CREATES A NEW ARRAY OF THE SPECIFIED
    DIMENSIONS AND BLTARRAY'S DATA FROM THE GIVEN ARRAY INTO THE
    NEW, THEN ALTERS THE ARRAY POINTER TO POINT TO THE NEW ARRAY.
    *REARRAY WILL NOT PERMIT YOU TO ALTER THE TYPE OF THE ARRAY
    AT PRESENT - YOU MUST SPECIFY THE CORRECT TYPE. IT IS RATHER
    MEANINGLESS TO USE *REARRAY OF MORE THAN ONE ARGUMENT ON A
    READTABLE OR OBARRAY.

(BLTARRAY <FROMARRAY> <TOARRAY>)		;SUBR 2

    BLTARRAY, AS BEFORE, COPIES THE DATA IN <FROMARRAY> INTO
    <TOARRAY>. IF <FROMARRAY> IS SHORTER, THEN EXTRA DATA IN
    <TOARRAY> IS UNHARMED, MORE OR LESS. IF <TOARRAY> IS
    SHORTER, THEN AS MUCH DATA AS WILL FIT IS COPIED.
    BLTARRAY INSISTS ON GETTING TWO ARRAYS OF THE SAME TYPE;
    IT WILL NOT COPY A FIXNUM ARRAY INTO A FLONUM ARRAY, AN
    S-EXPRESSION ARRAY, OR A READTABLE.
    IF ONE OBARRAY IS COPIED INTO ANOTHER, THE BUCKETS ARE
    COPIED AS WELL, AS IF FOR *ARRAY.

(LISTARRAY <ARRAY>)				;SUBR 1

    LISTARRAY NOW WORKS ON ARRAYS OF ALL TYPES AND ALL
    DIMENSIONS. IT RETURNS A LIST OF ALL THE DATA IN THE
    GIVEN ARRAY. IF A MULTI-DIMENSIONAL ARRAY IS GIVEN,
    THE DATA IS TAKEN IN ROW-MAJOR ORDER; FOR EXAMPLE:
	(ARRAY FOO FIXNUM 2 2)
	(LISTARRAY 'FOO)
    RETURNS FOO[0,0] FOO[0,1] FOO[1,0] FOO[1,1] AS A LIST
    IN THAT ORDER.

(FILLARRAY <ARRAY> <LIST>)			;SUBR 2

    FILLARRAY IS AN INVERSE TO LISTARRAY, EXCEPT THAT IT
    IS NOT PERMITTED TO USE FILLARRAY ON READTABLES OR
    OBARRAYS. IT DISTRIBUTES THE GIVEN LIST OF ITEMS
    INTO THE GIVEN ARRAY IN ROW-MAJOR ORDER. IF A FIXNUM
    OR FLONUM ARRAY IS SUPPLIED, THEN THE ELEMENTS OF THE
    LIST MUST ALL BE FIXNUMS OR FLONUMS, RESPECTIVELY.
    IF THERE ARE TOO MANY ITEMS IN THE LIST, THE EXTRA ONES
    ARE IGNORED; IF THERE ARE NOT ENOUGH, THEN THE LAST ONE
    IS USED TO FILL OUT THE ARRAY. THUS
	(FILLARRAY 'FOO '(43 11 27))	;RANDOM NUMBERS
    FILLS FOO, AS DEFINED ABOVE, SUCH THAT
	FOO[0,0] = 43
	FOO[0,1] = 11
	FOO[1,0] = 27
	FOO[1,1] = 27

(MAKOBLIST <ARG>)				;SUBR 1

    THIS FUNCTION WORKS AS BEFORE. NOTE THE FOLLOWING
    EQUIVALENCES IN THE NEW ARRAY SCHEME:
	(MAKOBLIST NIL)  <=>  (LISTARRAY OBARRAY)
	(MAKOBLIST X)    <=>  (*ARRAY X 'OBARRAY)
    FOR X NOT NIL.

(MAKREADTABLE <ARG>)				;SUBR 1

    THIS FUNCTION WORKS AS BEFORE. NOTE THE FOLLOWING
    EQUIVALENCES IN THE NEW ARRAY SCHEME:
	(MAKREADTABLE NIL)  <=>  (*ARRAY (GENSYM) 'READTABLE)
	(MAKREADTABLE T)    <=>  (*ARRAY (GENSYM) 'READTABLE T)
	(MAKREADTABLE X)    <=>  (*ARRAY X 'READTABLE)
    FOR X NOT NIL OR T.

(ARRAYCALL <TYPE> <APTR> <ARG1> ... <ARGN>)		;LSUBR (2 . 6)

    [SEE ALSO ITEM [4] BELOW.]
    ARRAYCALL IS SIMILAR TO FUNCALL, BUT INSISTS THAT ITS SECOND
    ARGUMENT BE AN ARRAY POINTER (AN ATOMIC SYMBOL WITH AN ARRAY
    PROPERTY IS NOT ACCEPTABLE IN THIS CONTEXT!) ITS FIRST ARGUMENT
    SHOULD MATCH THE TYPE INFORMATION OF THE ARRAY - EITHER FIXNUM,
    FLONUM, NIL, OR T.

    ITS PRIME VIRTUE IS THAT IT PERMITS THE COMPILER TO OPEN-CODE
    ACCESS TO VARIABLE ARRAYS. ONE MAY ALSO WRITE
	(STORE (ARRAYCALL TYPE VAR X1 ... XN) VAL)
    AND HAVE IT COMPILE EFFICIENTLY. EXAMPLE OF USE:
	(DEFUN TRANSPOSE (A)
	       (PROG (ARY TYP)
		     (COND ((EQ (SETQ TYP (TYPEP A)) 'ARRAY)
			    (SETQ ARY A))
			   ((AND (EQ TYP 'SYMBOL)
				 (SETQ ARY (GET A 'ARRAY))))
			   (T (RETURN
				 (TRANSPOSE
				    (ERROR 'NON-ARRAY/ -/ TRANSPOSE
					   A 'WRNG-TYPE-ARG)))))
		     (OR (AND (= (LENGTH (SETQ TYP
					       (ARRAYDIMS ARY)))
				 3)
			      (= (CADR TYP) (CADDR TYP)))
			 (RETURN
			    (TRANSPOSE
			       (ERROR 'NOT/ 2-DIM/ SQUARE/ -/ TRANSPOSE
				      A 'WRNG-TYPE-ARG))))
		     (DO ((N) (I 1 (1+ I)))
			 ((= I (CADR TYP)))
			(DO ((J 1 (1+ J)))
			    ((= J I))
			   (SETQ N (ARRAYCALL (CAR TYP) ARY I J))
			   (STORE (ARRAYCALL (CAR TYP) ARY I J)
				  (ARRAYCALL (CAR TYP) ARY J I))
			   (STORE (ARRAYCALL (CAR TYP) ARY J I) N)))
		     (RETURN A)))
    ANOTHER VARIATION WOULD BE TO LIMIT TRANSPOSE TO FIXNUM ARRAYS.
    THE EACH OF THE FOUR USAGES OF ARRAYCALL WOULD BE LIKE 
    (ARRAYCALL 'FIXNUM ARY . . .),  AND THE NCOMPLR WOULD BE ABLE 
    TO MAKE OPEN-CODED REFERENCES TO THE ARRAY.

PRIN1, PRINC, EXPLODEC, ETC.

    THE PRINT FUNCTIONS AND OTHER RELATED FUNCTIONS PRINT ARRAY
    POINTERS IN THE FOLLOWING MANNER: IF THE ARRAY POINTER IS
    DEAD (POINTS TO NO LIVE ARRAY), IT PRINTS AS "#DEAD-ARRAY".
    OTHERWISE IT PRINTS AS "#", THE TYPE OF ARRAY, "-", THE
    DIMENSIONS OF THE ARRAY SEPARATED BY ":" IN THE CURRENT
    RADIX, "-", AND THE ADDRESS OF THE ARRAY POINTER IN OCTAL.
    THUS PRINTING AN ARRAY POINTER LETS YOU SEE THE SAME
    INFORMATION RETURNED BY ARRAYDIMS. EXAMPLES:
USER:	(ARRAY NIL OBARRAY)
LISP:	#OBARRAY-777-103426
U:	(ARRAY NIL FIXNUM 4 5 6)
L:	#FIXNUM-4:5:6-103424
U:	(ARRAY FOO T 3 5 2 4 3)
L:	FOO
U:	(GET 'FOO 'ARRAY)
L:	#T-3:5:2:4:3-102362

[4] THREE NEW FUNCTIONS: SUBRCALL, LSUBRCALL, ARRAYCALL.
    (ARRAYCALL IS ALSO THORUGHLY DESCRIBED IN ITEM [3].)
    THESE ARE ANALOGOUS TO FUNCALL, IN THAT THEY TAKE
    A "FUNCTION" SPECIFICATION AS THE FIRST ARGUMENT AND
    AND ARGUMENTS FOR THAT FUNCTION AS THE REST OF THE
    ARGUMENTS. THE DIFFERENCE IS THAT THE SECOND ARGUMENT
    TO <FOO>CALL (FOR <FOO> AMONG [SUBR, LSUBR, ARRAY])
    SHOULD BE THE KIND OF ITEM YOU WOULD OBTAIN BY SAYING
    (GET 'QUUX '<FOO>) FOR SOME ATOMIC SYMBOL QUUX.
    THUS:
	(SUBRCALL NIL (GET 'CAR 'SUBR) '(A . B)) => A
    YOU USE THESE AT YOUR OWN RISK, OF COURSE; THE INTERPRETER
    CAN'T CHECK EVERYTHING. SOON THE COMPILER WILL OPEN-CODE
    THESE GUYS SUPER-EFFICIENTLY.
    HERE IS AN INTERESTING HACK:

	(SETQ SUBRDISPATCH (ARRAY NIL T 40))	;40=RANDOM SIZE

	(DO ((I 0 (1+ I))
	     (X '(CAR CDR CADR REVERSE EXPLODE ...) (CDR X)))
	    ((NULL X))
	    (STORE (ARRAYCALL T SUBRDISPATCH I)
		   (GET (CAR X) 'SUBR)))

	(SUBRCALL NIL (ARRAYCALL T SUBRDISPATCH 3) '(A B C)) => (C B A)

	(SUBRCALL NIL (ARRAYCALL T SUBRDISPATCH 1) '(A B C)) => B

    AND SO FORTH AND SO ON. THAT IS, YOU CAN HAVE AN ARRAY
    OF DISPATCH ADDRESSES. AGAIN, BE CAREFUL!

[5] FOR MACHINE LANGUAGE HACKERS ONLY:
    PDP-10 LISP'S UUO'S HAVE BEEN REARRANGED. LER2 AND LER4
    HAVE BEEN FLUSHED. LER3'S OPCODE HAS BEEN ALTERED.
    TWO NEW UUO'S: ACALL AND AJCALL. THE EFFECTIVE ADDRESS
    OF ACALL MUST AN ARRAY POINTER, WHICH SHOULD HAVE ITS
    COMPILED-CODE-NEEDS-ME BIT TURNED ON. ACALL SERVES
    AS AN NCALL TO AN ARRAY (ONE CAN'T INCREMENT THE
    EFFECTIVE ADDRESS OF AN NCALL TO AN ARRAY BECAUSE IT
    IS INDIRECT). THE UUO HANDLER THUS SMASHES NCALL'S TO
    ARRAYS TO BE ACALL'S INSTEAD OF PUSHJ'S, AND SIMILARLY
    NJCALL'S TO BE AJCALL'S. IN MOST PRACTICAL CASES THIS
    WILL NOT BE NECESSARY, SINCE THE COMPILER HOPEFULLY
    CAN OPEN-CODE MOST ARRAY ACCESSES ANYWAY.
    THE GETMIDASOP FUNCTION HAS BEEN UPDATED TO REFLECT
    THESE ALTERED OP-CODES.

[6] HH$X TRIES NOT TO SIGNAL A ^H INTERRUPT IF IT THINKS THAT THE
    INTERRUPT WILL BE STACKED IN THE INTERRUPT QUEUE RATHER THAN
    RUN IMMEDIATELY. IT WILL SIMPLY RETURN TO DDT IN THIS CASE.