(defmacro ! (&rest l) `(bang ',l)) (defmacro bang (l) (let ((l1 (mapcar #'bang1 l))) `,l1)) (defun bang1 (x) (cond ((var? x) `(gensym "?")) ((atom x) `',x) (t `(list `,@(mapcar #'bang1 x))))) (defun var? (x) (and (symbolp x) (eql (char (symbol-name x) 0) #\?)))