diff options
author | EuAndreh <eu@euandre.org> | 2023-07-22 10:51:51 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2023-07-22 10:51:51 -0300 |
commit | b57e7577b30409daab4345671eafc193d4cf9269 (patch) | |
tree | befe4f9223647a014092e9f1f0c7ac8b0168c162 /_pastebins/2023-07-22-funcallable-amop.md | |
parent | v2: dynamic.mk: Add WIP implementation of "eslaides(1)" (diff) | |
download | euandre.org-b57e7577b30409daab4345671eafc193d4cf9269.tar.gz euandre.org-b57e7577b30409daab4345671eafc193d4cf9269.tar.xz |
Pastebin on funcallable AMOP
Diffstat (limited to '_pastebins/2023-07-22-funcallable-amop.md')
-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))) +``` |