3 <RENTRY MSETG NEWSTRUC>
5 "Does SETG and MANIFEST"
6 <DEFINE MSETG ("TUPLE" DEFS:<<PRIMTYPE VECTOR> [REST ATOM ANY]>)
7 <COND (<NOT <0? <MOD <LENGTH .DEFS> 2>>>
8 <ERROR BAD-ARGUMENT-LIST!-ERRORS MSETG>)
10 <REPEAT ((EXPSPLICE <AND <ASSIGNED? EXPSPLICE> .EXPSPLICE>)
11 (REDEFINE <AND <ASSIGNED? REDEFINE> .REDEFINE>)
12 (HEAD:LIST (T)) (TAIL:LIST .HEAD) DEF:ATOM VAL:ANY)
14 <COND (<GASSIGNED? <SET DEF <1 .DEFS>>>
15 <COND (<OR .REDEFINE <=? .VAL ,.DEF>
16 <ERROR MSETG .DEF ALREADY-GASSIGNED ,.DEF>>
22 (<FORM SETG .DEF .VAL> <FORM MANIFEST .DEF>)>
23 <SET TAIL <REST .TAIL 2>>)
27 <COND (<EMPTY? <SET DEFS <REST .DEFS 2>>>
29 <MAPF <> ,EVAL <REST .HEAD>>
30 <RETURN <CHTYPE <REST .HEAD> SPLICE>>)
33 "Set up structure definitions. Takes name, primtype, pairs (sort of)
34 of name & type for slots in structure"
35 <DEFINE NEWSTRUC (NAM:<OR ATOM <LIST ATOM>> PRIM:<OR ATOM <LIST ATOM>>
36 "ARGS" ELEM:<PRIMTYPE LIST>
37 "AUX" (RPRIM:ATOM <COND (<TYPE? .PRIM LIST> <1 .PRIM>)
39 (LL:<PRIMTYPE LIST> <FORM <FORM PRIMTYPE .RPRIM>>)
40 (L:<PRIMTYPE LIST> .LL) OFFS DEC
41 R:<PRIMTYPE LIST> RR:<PRIMTYPE LIST> (CNT:FIX 1)
42 (EXPSPLICE <AND <ASSIGNED? EXPSPLICE> .EXPSPLICE>))
43 <REPEAT ((HEAD:LIST (T)) (TAIL:LIST .HEAD))
46 <COND (<ASSIGNED? RR> <PUTREST .R (<VECTOR !.RR>)>)>
49 <COND (<TYPE? .PRIM LIST>
54 <FORM QUOTE .LL>>)>>>)>
60 (<FORM NEWTYPE .NAM .RPRIM
62 <NEWTYPE .NAM .RPRIM .LL>)
64 <NEWTYPE .NAM .RPRIM .LL>)>)>)
67 <EVAL <FORM GDECL .NAM .LL>>
70 <RETURN <CHTYPE <REST .HEAD> SPLICE>>)
72 (<LENGTH? .ELEM 1> <ERROR NEWSTRUC>)>
75 <COND (<OR <NOT .OFFS> <TYPE? .OFFS FORM>>
77 <SET ELEM <REST .ELEM>>
79 <COND (<AND <TYPE? .OFFS STRING> <=? .OFFS "REST">>
80 <AND <ASSIGNED? RR> <ERROR NEWSTRUC TWO-RESTS>>
82 <SET RR <SET L <LIST REST>>>
83 <SET ELEM <REST .ELEM>>
86 <SETG .OFFS <OFFSET .CNT .NAM .DEC>>
90 (<FORM SETG .OFFS ,.OFFS>
91 <FORM MANIFEST .OFFS>)>
92 <SET TAIL <REST .TAIL 2>>)>)
96 <SETG .A <OFFSET .CNT .NAM .DEC>>
101 <FORM MANIFEST .OFFS>)>
102 <SET TAIL <REST .TAIL 2>>)>>
104 (T <ERROR NEWSTRUC>)>
106 <SET L <REST <PUTREST .L (.DEC)>>>
107 <SET ELEM <REST .ELEM 2>>>>