diff options
Diffstat (limited to '')
-rw-r--r-- | _pastebins/2023-07-22-funcallable-amop.md | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/_pastebins/2023-07-22-funcallable-amop.md b/_pastebins/2023-07-22-funcallable-amop.md new file mode 100644 index 0000000..e3e796d --- /dev/null +++ b/_pastebins/2023-07-22-funcallable-amop.md @@ -0,0 +1,43 @@ +--- + +title: Funcallable AMOP + +date: 2022-07-14 + +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))) +``` |