从plist宏体中提取并执行闭包/lambda



我正在尝试创建一个宏(bar(,应该这样使用:

(let ((my-var "foo"))
(bar ("some")
:buzz (lambda () (format t "~a~%" my-var))))

宏基本上应该只是FUNCALL lambda,并将MY-VAR考虑在内。

我想到的是:

(defmacro bar ((thing) &body body)
`(funcall (coerce (getf (list ,@body) :buzz) 'function)))

这是有效的,它打印";foo";。但我想知道是这样做的,还是有更好的方法。

首先,如果您不需要额外的、未使用的参数,那么这只是funcall,因为(lambda ...)表示一个函数。

(let ((my-var "foo"))
(funcall (lambda () (format t "~a~%" my-var))))

所以,即使你不想调用这个funcall,你也可以把它写成一个函数,而不是一个宏:它不进行任何代码转换。但据推测,你确实需要这个额外的参数,并且你打算在扩展中将其用于某些目的,所以你需要的是一个宏,它接受关键字参数,并扩展为合适的funcall形式:

(defmacro bar ((thing) &key (buzz '(lambda ())))
(declare (ignore thing))
`(funcall ,buzz))

最新更新