(defmacro cond-let (&rest clauses) (let (binds new-clauses) (mapc (lambda (c) (push (if (/= (length c) 3) c (let ((symbol-macros (mapcar (lambda (sym) (let ((g (gensym))) (push g binds) `(,sym ,g))) (first c)))) `((symbol-macrolet ,symbol-macros ,(second c)) (symbol-macrolet ,symbol-macros ,(third c))))) new-clauses)) clauses) `(let ,binds (cond ,@(nreverse new-clauses)))))