Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vax / mimlib / list-hacks.mud
diff --git a/mim/development/mim/vax/mimlib/list-hacks.mud b/mim/development/mim/vax/mimlib/list-hacks.mud
new file mode 100644 (file)
index 0000000..7836243
--- /dev/null
@@ -0,0 +1,68 @@
+
+<PACKAGE "LIST-HACKS">
+
+<ENTRY LSHUFFLE LSORT LREVERSE>
+
+<DEFINE LSHUFFLE (LST
+                "OPTIONAL" (N <FIX <+ 1 </ <LOG <LENGTH .LST>> <LOG 2>>>>)
+                "AUX" (A (())) (B (())) (AP .A) (BP .B) (TMP ()))
+       #DECL ((LST A B AP BP TMP VALUE) LIST (N) FIX)
+       <REPEAT ()
+               <COND (<L? <SET N <- .N 1>> 0> <RETURN .LST>)>
+               <REPEAT ()
+                       <COND (<EMPTY? .LST>
+                              <PUTREST .AP <REST .B>>
+                              <SET LST <REST .A>>
+                              <PUTREST .A ()>
+                              <PUTREST .B ()>
+                              <SET AP .A>
+                              <SET BP .B>
+                              <RETURN>)>
+                       <SET TMP <REST .LST>>
+                       <PUTREST .LST ()>
+                       <COND (<0? <MOD
+                               <CHTYPE <XORB <CHTYPE <TIME> FIX> <RANDOM>> FIX> 2>>
+                              <SET AP <REST <PUTREST .AP .LST>>>)
+                             (<SET BP <REST <PUTREST .BP .LST>>>)>
+                       <SET LST .TMP>>>>
+
+<DEFINE LSORT (L
+              "OPTIONAL" (CMPRSN <>) (ELIM-DUP <>)
+              "AUX" (M ()) (B ()) (TMP ()) (IT ()) (N 0))
+       #DECL ((L M B TMP IT VALUE) LIST (N) FIX (CMPRSN) <OR FALSE APPLICABLE>)
+       <PROG ()
+             <COND (<L? <SET N <LENGTH .L>> 2> <RETURN .L>)>
+             <SET B <REST <SET TMP <REST .L <- </ .N 2> 1>>>>>
+             <PUTREST .TMP ()>
+             <SET L <LSORT .L .CMPRSN .ELIM-DUP>>
+             <SET B <LSORT .B .CMPRSN .ELIM-DUP>>
+             <SET TMP ()>
+             <REPEAT ()
+                     <COND (<EMPTY? .L>
+                            <COND (<EMPTY? .TMP> <RETURN .B>)
+                                  (T <PUTREST .TMP .B> <RETURN .M>)>)
+                           (<EMPTY? .B>
+                            <COND (<EMPTY? .TMP> <RETURN .L>)
+                                  (T <PUTREST .TMP .L> <RETURN .M>)>)
+                           (<AND .ELIM-DUP <=? <1 .L> <1 .B>>>
+                            <SET L <REST .L>>)
+                           (T
+                            <COND (<COND (.CMPRSN
+                                          <APPLY .CMPRSN <1 .L> <1 .B>>)
+                                         (T <L? <STRCOMP <1 .L> <1 .B>> 0>)>
+                                   <SET L <REST <SET IT .L>>>)
+                                  (T <SET B <REST <SET IT .B>>>)>
+                            <PUTREST .IT ()>
+                            <COND (<EMPTY? .M> <SET M <SET TMP .IT>>)
+                                  (T <SET TMP <REST <PUTREST .TMP .IT>>>)>)>>>>
+
+
+<DEFINE LREVERSE (LST "AUX" (VAL ()) TMP)
+       #DECL ((LST VAL TMP VALUE) LIST)
+       <REPEAT ()
+               <COND (<EMPTY? .LST> <RETURN .VAL>)>
+               <SET TMP <REST .LST>>
+               <SET VAL <PUTREST .LST .VAL>>
+               <SET LST .TMP>>>
+
+<ENDPACKAGE>