微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从 plist 宏体中提取和执行闭包/lambda

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

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

宏应该基本上只是在考虑 MY-VAR 的情况下对 lambda 进行 FUNCALL。

我想到的是:

(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))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。