#!/usr/local/bin/sbcl --script (defmacro -> (form . forms) (if (null forms) form `(-> ,(nsubst form 'it (car forms)) ,@(cdr forms)))) (defun join-string (lst sep) (-> (loop :for rest :on (cdr lst) :for len := (list-length lst) :then (1- len) :until (= len 1) :for other := (random len) :unless (zerop other) :do (rotatef (car rest) (nth other rest)) :finally (return lst)) (print it))) (let ((x (list "a" "b" "c" "d"))) (print (join-string x " ")))