(defmacro eval-once ((&rest names) &body body) (let ((orig (mapcar (λ (x) (gensym (strcat "orig-" (symbol-name x) "-"))) names)) (evaled (mapcar (λ (x) `',(gensym (strcat "evaled-" (symbol-name x) "-"))) names))) `(let ,(mapcar #'list orig names) (let ,(mapcar #'list names evaled) `(let ,(mapcar #'list (list ,@evaled) (list ,@orig)) ,,@body)))))