51 lines
1.3 KiB
Plaintext
51 lines
1.3 KiB
Plaintext
(defmacro sort-places (. places)
|
|
(caseql (len places)
|
|
((0 1) nil)
|
|
(2 (with-gensyms (p0 p1)
|
|
^(placelet ((p0 (read-once ,[places 0]))
|
|
(p1 (read-once ,[places 1])))
|
|
(if (greater p0 p1)
|
|
(swap p0 p1)))))
|
|
(3 (with-gensyms (p0 p1 p2)
|
|
^(placelet ((p0 (read-once ,[places 0]))
|
|
(p1 (read-once ,[places 1]))
|
|
(p2 (read-once ,[places 2])))
|
|
(if (greater p0 p1)
|
|
(swap p0 p1))
|
|
(if (greater p1 p2)
|
|
(swap p1 p2))
|
|
(if (greater p0 p1)
|
|
(swap p0 p1)))))
|
|
(t (let ((gens [mapcar (ret (gensym)) places]))
|
|
(with-gensyms (vec)
|
|
^(placelet ,(zip gens places)
|
|
(let ((,vec (vec ,*gens)))
|
|
(nsort ,vec)
|
|
(set ,*(append-each ((g gens)
|
|
(i 0))
|
|
^(,g [,vec ,i]))))))))))
|
|
|
|
(prinl (sort-places))
|
|
|
|
(let ((x 1))
|
|
(sort-places x)
|
|
(prinl x))
|
|
|
|
(let ((x 2)
|
|
(y 1))
|
|
(sort-places x y)
|
|
(prinl (list x y)))
|
|
|
|
(let ((a 3)
|
|
(b 2)
|
|
(c 1))
|
|
(sort-places a b c)
|
|
(prinl (list a b c)))
|
|
|
|
(let ((a 4)
|
|
(b 3)
|
|
(c 2)
|
|
(d 1))
|
|
(sort-places a b c d)
|
|
(prinl (list a b c d)))
|