(defmacro switch (form &body clauses) (let ((end (gensym "END"))) `(block NIL (tagbody (case ,form ,@(loop for clause in clauses collect `(,(first clause) (go ,(first clause)))) (T (go ,end))) ,@(loop for clause in clauses append clause) ,end))))