(defun sym (&rest things) (intern (string-upcase (with-output-to-string (s) (dolist (th things) (princ th s)))))) (defmacro lazy (args &body body) `(make-instance 'lazy-function :fun (lambda ,args ,@body))) (defmacro write-lazy (name) (let ((class-name (sym name "-function"))) `(defmacro ,name (args &body body) `(make-instance ',',class-name :fun (lambda ,args ,@body))))) (write-lazy lazy)