gpt4 book ai didi

macros - 编写带有嵌套准引用的 Lisp 宏

转载 作者:太空宇宙 更新时间:2023-11-03 18:54:55 27 4
gpt4 key购买 nike

我正在尝试编写一个 Lisp 宏来编写一堆宏,但我在生成使用拼接运算符(在构建绑定(bind)中)首先扩展内部表达式的宏代码时遇到问题。

(defmacro define-term-construct (name filter-p list-keywords)
(let* ((do-list-name (output-symbol "do-~a-list" name))
(with-name (output-symbol "with-~a" name))
(do-filter-name (output-symbol "do-~as" name)))
`(progn
(defmacro ,do-list-name
(ls (&key ,@(append list-keywords '(id operation))) &body body)
(with-gensyms (el)
`(loop-list (,el ,ls :id ,id :operation ,operation)
(let (XXX,@(build-bind ,,name ,el))
(when (,',filter-p ,el)
(,',with-name ,el
,@body)))))))))

第一次通过后我想得到:

(define-term-construct some some-p (args name))

->

(PROGN
(DEFMACRO DO-SOME-LIST (LS (&KEY ARGS NAME ID OPERATION) &BODY BODY)
(WITH-GENSYMS (EL)
`(LOOP-LIST (,EL ,LS :ID ,ID :OPERATION ,OPERATION)
(LET (,@(BUILD-BIND ,SOME ,EL))
(WHEN (SOME-P ,EL)
(WITH-SOME ,EL
,@BODY)))))))

知道我应该使用什么引用/准引用来获得所需的代码吗?

最佳答案

你说你想要得到的输出有不平衡的逗号。 ,@ 已经平衡了反引号,所以你不能有 ,SOME,EL。这是只有一层反引号内的两层反引号/拼接。

我怀疑你想要:

`(WITH-GENSYMS (EL) ... (LET (,@(BUILD-BIND 'SOME EL)) ...))

some 符号作为原始宏的参数出现,并且在传递给 build-bind 函数时必须作为引号结束。 EL 直接求值。它只是 WITH-GENSYMS 绑定(bind)构造引入的一个局部变量,它不再在反引号上下文中,因为它在拼接内。

将其音译回原始外部宏的反引号:SOME 变为 ,name:

,@(build-bind ',name el)  ;; two commas out balance two backquotes in

符号拼接在保护引号的保护下,这将确保它被视为符号而不是变量。

el不需要拼接进去;它不是可变 Material ,而是正在生成的模板的硬编码功能。如果你要放置 ,el 它会在 define-term-construct 宏的作用域中寻找一个 el 变量,那里不存在这样的东西.

关于macros - 编写带有嵌套准引用的 Lisp 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9816225/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com