Funcallable AMOP
Posted on
Using macrolet to allow a funcallable-standard-class to be invoked without using
funcall directly, and let the macroexpansion do that instead:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#!/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)))
|