Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vax / mimlib / list-hacks.mud
1
2 <PACKAGE "LIST-HACKS">
3
4 <ENTRY LSHUFFLE LSORT LREVERSE>
5
6 <DEFINE LSHUFFLE (LST
7                  "OPTIONAL" (N <FIX <+ 1 </ <LOG <LENGTH .LST>> <LOG 2>>>>)
8                  "AUX" (A (())) (B (())) (AP .A) (BP .B) (TMP ()))
9         #DECL ((LST A B AP BP TMP VALUE) LIST (N) FIX)
10         <REPEAT ()
11                 <COND (<L? <SET N <- .N 1>> 0> <RETURN .LST>)>
12                 <REPEAT ()
13                         <COND (<EMPTY? .LST>
14                                <PUTREST .AP <REST .B>>
15                                <SET LST <REST .A>>
16                                <PUTREST .A ()>
17                                <PUTREST .B ()>
18                                <SET AP .A>
19                                <SET BP .B>
20                                <RETURN>)>
21                         <SET TMP <REST .LST>>
22                         <PUTREST .LST ()>
23                         <COND (<0? <MOD
24                                 <CHTYPE <XORB <CHTYPE <TIME> FIX> <RANDOM>> FIX> 2>>
25                                <SET AP <REST <PUTREST .AP .LST>>>)
26                               (<SET BP <REST <PUTREST .BP .LST>>>)>
27                         <SET LST .TMP>>>>
28
29 <DEFINE LSORT (L
30                "OPTIONAL" (CMPRSN <>) (ELIM-DUP <>)
31                "AUX" (M ()) (B ()) (TMP ()) (IT ()) (N 0))
32         #DECL ((L M B TMP IT VALUE) LIST (N) FIX (CMPRSN) <OR FALSE APPLICABLE>)
33         <PROG ()
34               <COND (<L? <SET N <LENGTH .L>> 2> <RETURN .L>)>
35               <SET B <REST <SET TMP <REST .L <- </ .N 2> 1>>>>>
36               <PUTREST .TMP ()>
37               <SET L <LSORT .L .CMPRSN .ELIM-DUP>>
38               <SET B <LSORT .B .CMPRSN .ELIM-DUP>>
39               <SET TMP ()>
40               <REPEAT ()
41                       <COND (<EMPTY? .L>
42                              <COND (<EMPTY? .TMP> <RETURN .B>)
43                                    (T <PUTREST .TMP .B> <RETURN .M>)>)
44                             (<EMPTY? .B>
45                              <COND (<EMPTY? .TMP> <RETURN .L>)
46                                    (T <PUTREST .TMP .L> <RETURN .M>)>)
47                             (<AND .ELIM-DUP <=? <1 .L> <1 .B>>>
48                              <SET L <REST .L>>)
49                             (T
50                              <COND (<COND (.CMPRSN
51                                            <APPLY .CMPRSN <1 .L> <1 .B>>)
52                                           (T <L? <STRCOMP <1 .L> <1 .B>> 0>)>
53                                     <SET L <REST <SET IT .L>>>)
54                                    (T <SET B <REST <SET IT .B>>>)>
55                              <PUTREST .IT ()>
56                              <COND (<EMPTY? .M> <SET M <SET TMP .IT>>)
57                                    (T <SET TMP <REST <PUTREST .TMP .IT>>>)>)>>>>
58
59
60 <DEFINE LREVERSE (LST "AUX" (VAL ()) TMP)
61         #DECL ((LST VAL TMP VALUE) LIST)
62         <REPEAT ()
63                 <COND (<EMPTY? .LST> <RETURN .VAL>)>
64                 <SET TMP <REST .LST>>
65                 <SET VAL <PUTREST .LST .VAL>>
66                 <SET LST .TMP>>>
67
68 <ENDPACKAGE>