(defun sym (&rest things) (intern (string-upcase (with-output-to-string (s) (dolist (th things) (princ th s)))))) (defmacro define-maker (name) (let* ((macro-name (sym "make-" name))) `(defmacro ,macro-name (args &body body) `(make-instance ',',name :fun (lambda ,args ,@body))))) (defun generate-maker (name) (let* ((class-name (etypecase name (symbol name) (class (class-name name)))) (macro-name (sym "make-" class-name))) (defmacro macro-name (args &body body) `(make-instance ',class-name :fun (lambda ,args ,@body))))) (defclass some-class () ((fun :initarg :fun))) (define-maker some-class) (generate-maker 'some-class) (generate-maker (class-of (make-instance 'some-class)))