(ql:quickload :iterate) (use-package :iterate) (defmacro-clause (SORTING expr &optional INTO var RESULT-TYPE type PREDICATE pred) (let ((type% (gensym)) (pred% (gensym)) (var (or var iterate::*result-var*)) (type (or type ''vector)) (pred (or pred ''<))) `(progn (with ,type% = ,type) (with ,pred% = ,pred) (accumulating ,expr :by (lambda (val seq) (merge ,type% (list val) seq ,pred%)) :initial-value (coerce nil ,type%) :into ,var)))) (iterate (repeat 10) (for x = (random 100)) (collect x)) ; (66 77 50 52 11 18 62 39 89 2) (iterate (repeat 10) (for x = (random 100)) (sorting x :result-type 'list :predicate '>)) ; (97 89 73 73 71 66 48 48 26 1)