Plaster

common-lisp
(defun sym (&rest things) (intern (string-upcase (with-output-to-string (s) (dolist (th things) (princ th s)))))) (defmacro define-maker (name) (alexandria:once-only (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 () ()) (define-maker 'some-class) (define-maker (class-of (make-instance 'some-class)))