From b57e7577b30409daab4345671eafc193d4cf9269 Mon Sep 17 00:00:00 2001 From: EuAndreh Date: Sat, 22 Jul 2023 10:51:51 -0300 Subject: Pastebin on funcallable AMOP --- _pastebins/2023-07-22-funcallable-amop.md | 43 +++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 _pastebins/2023-07-22-funcallable-amop.md (limited to '_pastebins') 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))) +``` -- cgit v1.2.3