1 LISP LIBRARY PACKAGES MANUAL 1 LISP LIBRARY PACKAGES MANUAL CIRCLPRINT 1 INPUT/OUTPUT 1 CIRCLPRINT 6 HPRINT is designed primarily for dumping circular or reentrant list structures (as well as other data structures for which READ is not an inverse of PRINT) so that they can be read back in by Interlisp. The CIRCLPRINT package is designed for printing circular or reentrant structures so that the user can look at them and understand them. A reentrant list structure is one that contains more than one occurrence of the same EQ structure. For example, TCONC makes use of reentrant list structure so that it does not have to search for the end of the list each time it is called. Thus, if X is a list of three elements, (A B C), being constructed by TCONC, the reentrant list structure used by TCONC for this purpose is: ((SKETCH NIL SKETCHCONTEXT ((ROUND 2 0) (MODERN 12 (BOLD REGULAR REGULAR)) (CENTER CENTER) ( CLOSEDLINE 10 12) NIL LAST (CENTER CENTER) (NIL NIL) T NIL NIL 1.0)) ((0.0 22.0 NIL) (WIRE (( 68.0 . 180.0) (68.0 . 136.0)) (ROUND 2.0 0) (NIL (CLOSEDLINE 10.0 12.0)) NIL 1.0)) ((0.0 12.0 NIL) (WIRE ((80.0 . 136.0) (80.0 . 112.0)) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((.024 24.0 NIL) (BOX (56.0 112.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((.05 14.0 NIL) (TEXT ( 68.0 . 124.0) ("A") 1.0 (CENTER CENTER) (MODERN 12 (BOLD REGULAR REGULAR)) ((63.5 117.0 9.0 14.0)) NIL)) ((0.0 30.0 NIL) (WIRE ((92.0 . 124.0) (152.0 . 124.0)) (ROUND 2.0 0) (NIL ( CLOSEDLINE 10.0 12.0)) NIL 1.0)) ((0.0 12.0 NIL) (WIRE ((80.0 . 192.0) (80.0 . 168.0)) ( ROUND 1 0) NIL (6 3 1 3) 1.0)) ((0.0 84.0 NIL) (WIRE ((92.0 . 180.0) (260.0 . 180.0) (260.0 . 136.0)) (ROUND 2.0 0) (NIL (CLOSEDLINE 10.0 12.0)) NIL 1.0)) ((.024 24.0 NIL) (BOX ( 56.0 168.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((.024 24.0 NIL) (BOX (152.0 112.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((.05 14.0 NIL) (TEXT (164.0 . 124.0) ("B") 1.0 (CENTER CENTER) (MODERN 12 (BOLD REGULAR REGULAR)) ((160.5 117.0 7.0 14.0)) NIL)) ((0.0 12.0 NIL) (WIRE ((176.0 . 136.0) (176.0 . 112.0)) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((0.0 30.0 NIL) (WIRE ((188.0 . 124.0) (248.0 . 124.0)) (ROUND 2.0 0) (NIL (CLOSEDLINE 10.0 12.0)) NIL 1.0)) ((.05 14.0 NIL) (TEXT (260.0 . 124.0) ("C") 1.0 (CENTER CENTER) (MODERN 12 (BOLD REGULAR REGULAR)) ((256.5 117.0 7.0 14.0)) NIL)) ((0.0 12.0 NIL) (WIRE ((272.0 . 136.0) ( 272.0 . 112.0)) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((.05 10.0 NIL) (TEXT (284.0 . 124.0) ("NIL" ) 1.0 (CENTER CENTER) (MODERN 6 (BOLD REGULAR REGULAR)) ((279.0 119.0 10.0 10.0)) NIL)) (( .024 24.0 NIL) (BOX (248.0 112.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL)))) (55.0 109.0 242.0 86.0) 1.0 4.0 This structure would be printed by PRINT as ((A B C) C). Note that PRINT would produce the same output for the nonreentrant structure: ((SKETCH NIL SKETCHCONTEXT ((ROUND 2 0) (MODERN 12 (BOLD REGULAR REGULAR)) (CENTER CENTER) ( CLOSEDLINE 10 12) NIL LAST (CENTER CENTER) (NIL NIL) T NIL NIL 1.0)) ((.024 24.0 NIL) (BOX ( 152.0 72.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((.05 10.0 NIL) (TEXT (188.0 . 84.0) ("NIL") 1.0 (CENTER CENTER) (MODERN 6 (BOLD REGULAR REGULAR)) ((183.0 79.0 10.0 10.0)) NIL)) ((0.0 12.0 NIL) (WIRE ((176.0 . 96.0) (176.0 . 72.0)) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((.05 14.0 NIL) (TEXT (164.0 . 84.0) ("C") 1.0 (CENTER CENTER) (MODERN 12 (BOLD REGULAR REGULAR)) ((160.5 77.0 7.0 14.0)) NIL)) ((0.0 30.0 NIL) (WIRE ((92.0 . 84.0) (152.0 . 84.0)) (ROUND 2.0 0) (NIL (CLOSEDLINE 10.0 12.0)) NIL 1.0)) ((.024 24.0 NIL) (BOX (56.0 72.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((0.0 12.0 NIL) (WIRE ((80.0 . 96.0) (80.0 . 72.0)) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((0.0 22.0 NIL) (WIRE ((68.0 . 84.0) (68.0 . 40.0)) (ROUND 2.0 0) (NIL (CLOSEDLINE 10.0 12.0)) NIL 1.0)) ((0.0 12.0 NIL) (WIRE ((80.0 . 40.0) (80.0 . 16.0) ) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((.024 24.0 NIL) (BOX (56.0 16.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((0.0 12.0 NIL) (WIRE ((176.0 . 40.0) (176.0 . 16.0)) (ROUND 1 0) NIL ( 6 3 1 3) 1.0)) ((.024 24.0 NIL) (BOX (152.0 16.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((.05 14.0 NIL) (TEXT (68.0 . 28.0) ("A") 1.0 (CENTER CENTER) (MODERN 12 (BOLD REGULAR REGULAR)) ((63.5 21.0 9.0 14.0)) NIL)) ((0.0 30.0 NIL) (WIRE ((92.0 . 28.0) (152.0 . 28.0)) (ROUND 2.0 0) (NIL (CLOSEDLINE 10.0 12.0)) NIL 1.0)) ((.05 14.0 NIL) (TEXT (164.0 . 28.0) ("B") 1.0 (CENTER CENTER) (MODERN 12 (BOLD REGULAR REGULAR)) ((160.5 21.0 7.0 14.0)) NIL)) ((0.0 30.0 NIL) (WIRE ((188.0 . 28.0) (248.0 . 28.0)) (ROUND 2.0 0) (NIL (CLOSEDLINE 10.0 12.0)) NIL 1.0)) ((.05 14.0 NIL) (TEXT (260.0 . 28.0) ("C") 1.0 (CENTER CENTER) (MODERN 12 (BOLD REGULAR REGULAR)) ((256.5 21.0 7.0 14.0)) NIL)) ((.024 24.0 NIL) (BOX (248.0 16.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((0.0 12.0 NIL) (WIRE ((272.0 . 40.0) (272.0 . 16.0) ) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((.05 10.0 NIL) (TEXT (284.0 . 28.0) ("NIL") 1.0 (CENTER CENTER) (MODERN 6 (BOLD REGULAR REGULAR)) ((279.0 23.0 10.0 10.0)) NIL))) (55.0 13.0 242.0 86.0) 1.0 4.0 In other words, PRINT does not indicate the fact that portions of the structure in the first figure are identical. Similarly, if PRINT is applied to a circular list structure (a special type of reentrant structure) it will never terminate. For example, if PRINT is called on the structure: ((SKETCH NIL SKETCHCONTEXT ((ROUND 2 0) (MODERN 12 (BOLD REGULAR REGULAR)) (CENTER CENTER) ( CLOSEDLINE 10 12) NIL LAST (CENTER CENTER) (NIL NIL) T NIL NIL 1.0)) ((0.0 12.0 NIL) (WIRE (( 76.0 . -8.0) (76.0 . -32.0)) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((0.0 14.0 NIL) (WIRE ((64.0 . -20.0) (64.0 . -48.0) (36.0 . -48.0) (36.0 . -20.0) (52.0 . -20.0)) (ROUND 2 0) (NIL ( CLOSEDLINE 10 12.0) T) NIL 1.0)) ((.05 10.0 NIL) (TEXT (88.0 . -20.0) ("NIL") 1.0 (CENTER CENTER) (MODERN 6 (BOLD REGULAR REGULAR)) ((83.0 -25.0 10.0 10.0)) NIL)) ((.024 24.0 NIL) ( BOX (52.0 -32.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL)))) (32.0 -52.0 69.0 47.0) 1.0 4.0 it will print an endless sequence of left parentheses, and if applied to: ((SKETCH NIL SKETCHCONTEXT ((ROUND 2 0) (MODERN 12 (BOLD REGULAR REGULAR)) (CENTER CENTER) ( CLOSEDLINE 10 12) NIL LAST (CENTER CENTER) (NIL NIL) T NIL NIL 1.0)) ((.05 14.0 NIL) (TEXT ( 156.0 . -20.0) ("A") 1.0 (CENTER CENTER) (MODERN 12 (BOLD REGULAR REGULAR)) ((151.5 -27.0 9.0 14.0)) NIL)) ((0.0 40.0 NIL) (WIRE ((180.0 . -20.0) (208.0 . -20.0) (208.0 . -44.0) (128.0 . -44.0) (128.0 . -20.0) (144.0 . -20.0)) (ROUND 2 0) (NIL (CLOSEDLINE 10 12.0) T) NIL 1.0) ) ((0.0 12.0 NIL) (WIRE ((168.0 . -8.0) (168.0 . -32.0)) (ROUND 1 0) NIL (6 3 1 3) 1.0)) (( .024 24.0 NIL) (BOX (144.0 -32.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL)))) (124.0 -48.0 88.0 43.0) 1.0 4.0 will print a left parenthesis followed by an endless sequence of A's. The function CIRCLPRINT described below produces output that will exactly describe the structure of any circular or reentrant list structure. This output may be in either single- or double-line format. Below are a few examples of the expressions that CIRCLPRINT would produce to describe the structures discussed above. First figure, single-line: ((A B *1* C)1) First figure, double-line: ((A B C) 1) 1 Third figure, single-line: (*1* 1) Third figure, double-line: (1) 1 Fourth figure, single-line: (*1* A . 1) Fourth figure, double-line: (A . 1) 1 The more complex structure: ((SKETCH NIL SKETCHCONTEXT ((ROUND 2 0) (MODERN 12 (BOLD REGULAR REGULAR)) (CENTER CENTER) ( CLOSEDLINE 10 12) NIL LAST (CENTER CENTER) (NIL NIL) T NIL NIL 1.0)) ((.024 24.0 NIL) (BOX ( 60.0 -96.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((0.0 90.0 NIL) (WIRE ((96.0 . -84.0) (276.0 . -84.0) (276.0 . -128.0)) (ROUND 2 0) (NIL (CLOSEDLINE 10 12.0) T) NIL 1.0)) ((0.0 12.0 NIL) (WIRE ((84.0 . -72.0) (84.0 . -96.0)) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((0.0 22.0 NIL) (WIRE ((72.0 . -84.0) (72.0 . -128.0)) (ROUND 2.0 0) (NIL (CLOSEDLINE 10.0 12.0)) NIL 1.0)) ((0.0 52.0 NIL) (WIRE ((140.0 . -140.0) (140.0 . -176.0) (36.0 . -176.0) (36.0 . -84.0) (60.0 . -84.0)) (ROUND 2 0) (NIL (CLOSEDLINE 10 12.0) T) NIL 1.0)) ((0.0 12.0 NIL) ( WIRE ((84.0 . -128.0) (84.0 . -152.0)) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((.024 24.0 NIL) (BOX (60.0 -152.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((0.0 14.0 NIL) (WIRE ((72.0 . -140.0) (72.0 . -168.0) (44.0 . -168.0) (44.0 . -140.0) (60.0 . -140.0)) (ROUND 2 0) (NIL ( CLOSEDLINE 10 12.0) T) NIL 1.0)) ((0.0 16.0 NIL) (WIRE ((96.0 . -140.0) (128.0 . -140.0)) ( ROUND 2.0 0) (NIL (CLOSEDLINE 10.0 12.0)) NIL 1.0)) ((0.0 12.0 NIL) (WIRE ((152.0 . -128.0) (152.0 . -152.0)) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((0.0 16.0 NIL) (WIRE ((164.0 . -140.0) (196.0 . -140.0)) (ROUND 2.0 0) (NIL (CLOSEDLINE 10.0 12.0)) NIL 1.0)) ((.024 24.0 NIL) ( BOX (128.0 -152.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((0.0 74.0 NIL) (WIRE ((300.0 . -140.0) (300.0 . -168.0) (152.0 . -168.0) (152.0 . -152.0)) (ROUND 2 0) (NIL (CLOSEDLINE 10 12.0) T) NIL 1.0)) ((0.0 12.0 NIL) (WIRE ((220.0 . -128.0) (220.0 . -152.0)) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((.05 14.0 NIL) (TEXT (208.0 . -140.0) ("A") 1.0 (CENTER CENTER) ( MODERN 12 (BOLD REGULAR REGULAR)) ((203.5 -147.0 9.0 14.0)) NIL)) ((0.0 16.0 NIL) (WIRE (( 232.0 . -140.0) (264.0 . -140.0)) (ROUND 2.0 0) (NIL (CLOSEDLINE 10.0 12.0)) NIL 1.0)) (( .024 24.0 NIL) (BOX (196.0 -152.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((0.0 12.0 NIL ) (WIRE ((288.0 . -128.0) (288.0 . -152.0)) (ROUND 1 0) NIL (6 3 1 3) 1.0)) ((.024 24.0 NIL) (BOX (264.0 -152.0 48.0 24.0) (ROUND 1 0) NIL 1.0 (NIL NIL))) ((.05 14.0 NIL) (TEXT ( 276.0 . -140.0) ("B") 1.0 (CENTER CENTER) (MODERN 12 (BOLD REGULAR REGULAR)) ((272.5 -147.0 7.0 14.0)) NIL))) (32.0 -180.0 281.0 111.0) 1.0 4.0 is printed as follows: Single-line: (*2* (*1* 1 *3* 2 A *4* B . 3) . 4) Double-line: (( 1 2 A B . 3) . 4) 21 3 4 In both formats, the reentrant nodes in the list structure are labeled by numbers. (A reentrant node is one that has two or more pointers coming into it.) In the single-line format, the label is printed between asterisks at the beginning of the node (list or tail) that it identifies. In the double-line format, the label is printed below the beginning of the node it identifies. An occurrence of a reentrant node that has already been identified is indicated by printing its label in brackets. (CIRCLPRINT LIST PRINTFLG RLKNT) [Function] Prints an expression describing LIST. If PRINTFLG=NIL, double-line format is used, otherwise single-line format. CIRCLPRINT first calls CIRCLMARK, and then calls either RLPRIN1 (if PRINTFLG=T) or RLPRIN2 (if PRINTFLG=NIL). Finally, RLRESTORE is called to restore LIST to its unmarked state. Returns LIST. (CIRCLMARK LIST RLKNT) [Function] Marks each reentrant node in LIST with a unique number, starting at RLKNT plus one (or one, if RLKNT is NIL). Value is RLKNT. Marking LIST physically alters it. However, the marking is performed undoably. In addition, LIST can always be restored by specifically calling RLRESTORE. (RLPRIN1 LIST) [Function] Prints an expression describing LIST in the single-line format. Does not restore LIST to its unCIRCLMARKed state. LIST must previously have been CIRCLMARKed, or an error is generated. (RLPRIN2 LIST) [Function] Same as RLPRIN1, except that the expression describing LIST is printed in the double-line format. (RLRESTORE LIST) [Function] Physically restores list to its original, unmarked state. Note that the user can mark and print several structures that together share common substructures, e.g., several property lists, by making several calls to CIRCLMARK, followed by calls to RLPRIN1 or RLPRIN2, and finally to RLRESTORE. (CIRCLMAKER LIST) [Function] LIST may contain labels and references following the convention used by CIRCLPRINT for printing reentrant structures in single-line format, e.g., (*1* . 1). CIRCLMAKER performs the necessary RPLACAs and RPLACDs to make LIST correspond to the indicated structure. Value is (altered) LIST. (CIRCLMAKER1 LIST) [Function] Does the work for CIRCLMAKER. Uses free variables LABELST and REFLST. LABELST is a list of dotted pairs of labels and corresponding nodes. REFLST is a list of nodes containing references to labels not yet seen. CIRCLMAKER operates by initializing LABELST and REFLST to NIL, and then calling CIRCLMAKER1. It generates an error if REFLST is not NIL when CIRCLMAKER1 returns. The user can call CIRCLMAKER1 directly to ©©connect up'' several structures that share common substructures, e.g., several property lists.(LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC ) STARTINGPAGE# 241) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC )) (270 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 618) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC )) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD LEFT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC )) (54 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGV) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE VERSOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC )) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC )) (270 12 288 36) NIL) (HEADING NIL (HEADINGTYPE FOOTINGR) (54 27 558 36) NIL) (HEADING NIL (HEADINGTYPE RECTOHEAD) (54 762 558 36) NIL) (TEXT NIL NIL (54 54 504 684) NIL))))) .ÌÌøø.œœøø.ÌÌøø.ÌÌø ø.ÌÌøøBøø PAGEHEADING VERSOHEADBøø PAGEHEADING RECTOHEADAøø PAGEHEADINGFOOTINGVAøø PAGEHEADINGFOOTINGR(MODERN MODERNMODERN ?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8))   HRULE.GETFNMODERN   HRULE.GETFNMODERN   HRULE.GETFNMODERN   HRULE.GETFNMODERN   HRULE.GETFNMODERN Túƒù SKIO.GETFN.2MODERN ˆ £ SKIO.GETFN.2MODERN ñ  2½ SKIO.GETFN.2JØ SKIO.GETFN.2MODERN BB  # SKIO.GETFN.2MODERN  %  ò   †  /!   # Q;   .B  7'  :ê  Ù:  4'Èzº