aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2023-07-22 10:51:51 -0300
committerEuAndreh <eu@euandre.org>2023-07-22 10:51:51 -0300
commitb57e7577b30409daab4345671eafc193d4cf9269 (patch)
treebefe4f9223647a014092e9f1f0c7ac8b0168c162
parentv2: dynamic.mk: Add WIP implementation of "eslaides(1)" (diff)
downloadeuandre.org-b57e7577b30409daab4345671eafc193d4cf9269.tar.gz
euandre.org-b57e7577b30409daab4345671eafc193d4cf9269.tar.xz
Pastebin on funcallable AMOP
-rw-r--r--_pastebins/2023-07-22-funcallable-amop.md43
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)))
+```