5 <DEFINE SORT (PRED S1 "OPTIONAL" (L1 1) (OFFS 0) "TUPLE" T
6 "AUX" L NN S SS E EE (STR? <>) SN)
7 #DECL ((PRED) <OR FALSE APPLICABLE> (S1 S SS) ANY
8 (E EE) ANY (STR?) <OR ATOM FALSE> (L1 L OFFS NN SN) FIX)
11 <COND (<TYPE? .S1 VECTOR>
14 <SET SS <REST .S .L1>>)
18 <SET SS <REST .S .L1>>)
22 <SET SS <REST .S .L1>>)
26 <SET SS <REST .S .L1>>)
28 <RETURN <ERROR BAD-SORT-RECORD!-ERRORS>>)>
29 <COND (<NOT <EMPTY? .T>>
30 <SET SN </ <LENGTH .S1> .L1>>
31 <REPEAT ((TT .T) X LX)
33 <COND (<EMPTY? .TT> <RETURN>)>
36 <COND (<EMPTY? .TT> <SET L 1>)
40 <COND (<AND <==? .SN </ <SET LX <LENGTH .X>> .L>>
43 <ERROR INCONSISTENT-SORT-RECORD!-ERRORS
45 <COND (<TYPE? .E STRING> <SET STR? T>)>
47 <COND (<COND (<TYPE? .SS VECTOR> <EMPTY? .SS>)
48 (<TYPE? .SS UVECTOR> <EMPTY? .SS>)
49 (<TYPE? .SS LIST> <EMPTY? .SS>)
50 (<TYPE? .SS TUPLE> <EMPTY? .SS>)>
51 <COND (<TYPE? .S VECTOR> <SET S <REST .S .L1>>)
52 (<TYPE? .S UVECTOR> <SET S <REST .S .L1>>)
53 (<TYPE? .S LIST> <SET S <REST .S .L1>>)
54 (<TYPE? .S TUPLE> <SET S <REST .S .L1>>)>
55 <COND (<LENGTH? .S .L1> <RETURN .S1>)
58 <SET SS <REST .S .L1>>)
61 <SET SS <REST .S .L1>>)
64 <SET SS <REST .S .L1>>)
67 <SET SS <REST .S .L1>>)>)>
68 <COND (<TYPE? .S VECTOR>
69 <SET EE <NTH .SS .NN>>)
71 <SET EE <NTH .SS .NN>>)
73 <SET EE <NTH .SS .NN>>)
75 <SET EE <NTH .SS .NN>>)>
76 <COND (<COND (.PRED <APPLY .PRED .E .EE>)
77 (.STR? <G? <SET L <STRCOMP .E .EE>> 0>)
81 <COND (<NOT <EMPTY? .T>>
84 <COND (<EMPTY? .TT> <RETURN>)>
87 <COND (<EMPTY? .TT> <SET L 1>)
94 </ <LENGTH .S> .L1>>>>
98 </ <LENGTH .SS> .L1>>>>
100 <COND (<TYPE? .SS VECTOR>
101 <SET SS <REST .SS .L1>>)
103 <SET SS <REST .SS .L1>>)
105 <SET SS <REST .SS .L1>>)
107 <SET SS <REST .SS .L1>>)>>>>
109 <DEFINE SWITCH (S SS L)
111 <COND (<AND <TYPE? .S VECTOR> <TYPE? .SS VECTOR>>
113 <FUNCTION (S SS "AUX" (TMP <1 .S>))
116 <COND (<0? <SET L <- .L 1>>>
119 (<AND <TYPE? .S UVECTOR> <TYPE? .SS UVECTOR>>
121 <FUNCTION (S SS "AUX" (TMP <1 .S>))
124 <COND (<0? <SET L <- .L 1>>>
127 (<AND <TYPE? .S LIST> <TYPE? .SS LIST>>
129 <FUNCTION (S SS "AUX" (TMP <1 .S>))
132 <COND (<0? <SET L <- .L 1>>>
135 (<AND <TYPE? .S TUPLE> <TYPE? .SS TUPLE>>
137 <FUNCTION (S SS "AUX" (TMP <1 .S>))
140 <COND (<0? <SET L <- .L 1>>>