--- /dev/null
+
+<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>