--- title: Funcallable AMOP date: 2023-07-22 layout: post lang: en ref: funcallable-amop --- Using `macrolet` to allow a `funcallable-standard-class` to be invoked without using `funcall` directly, and let the macroexpansion do that instead: ``` #!/usr/bin/env li (asdf:load-system :closer-mop) (defclass constructor () ((name :initarg :name :accessor constructor-name)) (:metaclass closer-mop:funcallable-standard-class)) (defmethod initialize-instance :after ((c constructor) &key) (with-slots (name) c (closer-mop:set-funcallable-instance-function c (lambda (x) (format t "~s: ~s - ~s~%" name :funcalled x))))) (let ((c (make-instance 'constructor :name "the-name"))) (funcall c 1)) (let ((c (make-instance 'constructor :name "the-name"))) (macrolet ((c (&body body) `(funcall c ,@body))) (funcall c 2) (c 3))) ```