1
0
mirror of synced 2026-01-13 15:37:38 +00:00
Interlisp.medley/lispusers/MULTI-ALIST.TEDIT
2025-01-29 22:57:37 -08:00

84 lines
10 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Medley MULTI-ALIST
2
4
1
MULTI-ALIST
1
4
By Ron Kaplan
This document was last edited in January 2025.
MULTI-ALIST provides a collection of macros that make it easy to store and retrieve items in a hierarchical, multi-level association list indexed by an arbitrary number of keys. The macro PUTMULTI adds a new value to a list of indexed items and GETMULTI returns the items at that index.
(PUTMULTI PLACE KEY1...KEYn VAL) [Macro]
PLACE is a commonLIsp place, a form that can be passed as the first argument of CL:SETF. KEY1 through KEYn are the indexing keys and VAL is a new value to be pushed at the bottom of the multi-alist. The value of PUTMULTI is VAL. For example, if the variable WINES is initialized to NIL and the following expressions are evaluated
(PUTMULTI WINES 'RED 'DRY 'FRENCH 'CABERNET)ÿÿ
ÿ(PUTMULTI WINES 'RED 'DRY 'FRENCH 'PINOT-NOIR)ÿÿ
ÿ(PUTMULTI WINES 'WHITE 'DRY 'FRENCH 'CHARDONNAY)
the value of WINES will be the multi-alist
((RED (DRY (FRENCH CABERNET PINOT-NOIR)))ÿÿ
ÿ (WHITE (DRY (FRENCH CHARDONNAY)))
The macro GETMULTI retrieves the value stored under a sequence of keys anchored at PLACE:
(GETMULTI PLACE KEY1...KEYn) [Macro]
For the wine example the expression
(GETMULTI WINES 'RED 'DRY 'FRENCH)
will return the list (PINOT-NOIR CABERNET).
The expression (PUTMULTI WINES 'RED 'DRY 'FRENCH 'CABERNET) effectively expands to the fragment
(LET (TEMP)ÿÿ
ÿ(LOCALVARS TEMP)ÿÿ
ÿ(SETQ TEMP (OR (SASSOC 'RED WINES)ÿÿ
ÿ (CAR (CL:PUSH (CONS 'RED) WINES))))ÿÿ
ÿ(SETQ TEMP (OR (SASSOC 'DRY (CDR TEMP))ÿÿ
ÿ (CAR (CL:PUSH (CONS 'DRY) (CDR TEMP)))))ÿÿ
ÿ(SETQ TEMP (OR (SASSOC 'FRENCH (CDR TEMP))ÿÿ
ÿ (CAR (CL:PUSH (CONS 'FRENCH) (CDR TEMP)))))ÿÿ
ÿ(CL:PUSH 'CABERNET (CDR TEMP))ÿÿ
ÿ'CABERNET
and (GETMULTI WINDOW 'RED 'DRY 'FRENCH) effectively expands to
(LET (TEMP)ÿÿ
ÿ(LOCALVARS TEMP)ÿÿ
ÿ(SETQ TEMP (CDR (SASSOC 'RED WINES)))ÿÿ
ÿ(SETQ TEMP (CDR (SASSOC 'DRY TEMP)))ÿÿ
ÿ(CDR (SASSOC 'FRENCH TEMP))
PUTMULTI-D and PUTMULTI-NEW are variations on this basic scheme.
(PUTMULTI-D PLACE KEY1...KEYn VAL) [Macro]
Uses RPLACD instead of CL:PUSH to destructively store VAL as the only value at the bottom of the multi-alist. Any previous value(s) located by those keys are replaced by the new value. As an example, an entry could be added to the \FONTSINCORE database by
(PUTMULTI-D \FONTSINCORE FAMILY SIZE FACE ROTATION DEVICE FONT)
and retrieved by
(GETMULTI \FONTSINCORE FAMILY SIZE FACE ROTATION DEVICE)
(PUTMULTI-NEW PLACE KEY1...KEYn VAL) [Macro]
The value VAL is added to the multi-alist only if it is not already a MEMBER of the values at the bottom.
Fast versions of these macros use FASSOC instead of SASSOC to traverse through the structure. All indexing keys are thus matched by EQ.
(FPUTMULTI PLACE KEY1...KEYn VAL) [Macro]ÿÿ
ÿ(FPUTMULTI-D PLACE KEY1...KEYn) [Macro]ÿÿ
ÿ(FPUTMULTI-NEW PLACE KEY1...KEYn VAL) [Macro]
(FGETMULTI PLACE KEY1...KEYn VAL) [Macro]
The macro ADDTOMULTI pushes a value at the bottom of the list, like PUTMULTI, but the keys are provided as a precomputed list and not spread out as individual arguments.
(ADDTOMULTI PLACE KEYS VAL) [Macro]
There are rudimentary macros for computing histograms and cross-tabulations:
(PUTMULTI-COUNT PLACE KEY1...KEYn) [Macro]
The value located by KEY1...KEYn is the number of times that PUTMULTI-COUNT has been evaluated in that place and with those keys.
(PUTMULTI-SUM PLACE KEY1...KEYn NUM) [Macro]
NUM must be a number. The value located by the keys is the running sum of numbers "inserted" with those keys.
Items can be removed from a multi-alist by the macros REMOVEMULTI and REMOVMULTIALL:
(REMOVEMULTI PLACE KEY1...KEYn VAL) [Macro]
Removes VAL from the location indexed by the keys.
(REMOVEMULTIALL PLACE KEY1...KEYn) [Macro]
Removes all values at the location indexed by KEY1...KEYn.
The function MAPMULTI iterates through paths in a multi-alist.
(MAPMULTI MULTIALIST MAPFN) [Function]
The m-ary function MAPFN is applied to each m-length successive substructure of MULTIALIST. Thus, if F is a 4 argument function and (MAPMULTI WINES F) is evaluated, then on one application F will receive the arguments RED DRY FRENCH CABERNET. The arity m=4 in this case covers the 3 keys and the final value of each path. For m less than 3 the last argument will be one entry in the trailing sub-alist of the structure after a prefix of initial keys. Thus for m=3 the function would receive
RED DRY (FRENCH ZINFANDEL CABERNET
at one of its applications.
(COLLECTMULTI MULTIALIST COLLECTFN) [Function]
This binds the special variable $$COLLECT, calls (MAPMULTI MULTIALIST COLLECTFN), and returns the final value of $$COLLECT. The value will contain any items that the mapping function decides to push onto $$COLLECT.
(SEQUENCE NIL NIL (0 0 0 0) ((PAGE NIL (PAPERSIZE Letter STARTINGPAGE# NIL LANDSCAPE? NIL FOLIOINFO (ARABIC "" "")) (0 0 612 792) ((HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (ALTERNATE NIL NIL (0 0 0 0) ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) 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)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) 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)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL)))))))
1$4È$È4$6È$È4È$È4È $È4$$È$È1È$1ŠŠ8$1ŠŠ8$JÈ$È PAGEHEADING RUNNINGHEAD
MODERN
CLASSIC
fX(TEDIT-FONTCLASS 0 (TERMINAL 10) NIL NIL (POSTSCRIPT (TERMINAL 10)) (PDF (TERMINAL 10)))
eW(TEDIT-FONTCLASS 0 (TERMINAL 8) NIL NIL (POSTSCRIPT (TERMINAL 10)) (PDF (TERMINAL 10)))fX(TEDIT-FONTCLASS 0 (TERMINAL 10) NIL NIL (POSTSCRIPT (TERMINAL 10)) (PDF (TERMINAL 10)))
`R(TEDIT-FONTCLASS 0 (MODERN 10) NIL NIL (POSTSCRIPT (MODERN 10)) (PDF (MODERN 10)))
dV(TEDIT-FONTCLASS 0 (MODERN 10) NIL NIL (POSTSCRIPT (TERMINAL 10)) (PDF (TERMINAL 10)))
eW(TEDIT-FONTCLASS 0 (TERMINAL 8) NIL NIL (POSTSCRIPT (TERMINAL 10)) (PDF (TERMINAL 10)))ÿýTERMINAL
i[(TEDIT-FONTCLASS 0 (TERMINAL 8 BRR) NIL NIL (POSTSCRIPT (TERMINAL 10)) (PDF (TERMINAL 10)))MODERN
MODERN 
TIMESROMAN$


 HRULE.GETFN HRULE.GETFN HRULE.GETFN   HRULE.GETFN  HRULE.GETFN 0  ± 1 #    S     '$    -,02
)$

 A     $#,$
$5)9,<  #
'&
 (    á@8    
9" K             

0 \ M 7k6 
).
* 8
 'ú##    R DATE:iaÓßÄUzº