Macros 使用嵌套的准序列化编写Lisp宏
我正试图编写一个Lisp宏来编写一组宏,但在生成宏代码时遇到了一些问题,这些宏代码使用了首先在表达式内部展开的拼接操作符(内部构建绑定)Macros 使用嵌套的准序列化编写Lisp宏,macros,lisp,Macros,Lisp,我正试图编写一个Lisp宏来编写一组宏,但在生成宏代码时遇到了一些问题,这些宏代码使用了首先在表达式内部展开的拼接操作符(内部构建绑定) (定义术语构造(名称过滤器-p列表关键字) (let*((do列表名称(输出符号“do-~a-list”名称)) (带名称(输出符号“带-~a”名称)) (do过滤器名称(输出符号“do-~as”名称))) `(项目 (defmacro,do列表名称 (ls(&key、@(附加列表关键字)(id操作))和正文) (带gensyms(el) `(循环列表(,el
(定义术语构造(名称过滤器-p列表关键字)
(let*((do列表名称(输出符号“do-~a-list”名称))
(带名称(输出符号“带-~a”名称))
(do过滤器名称(输出符号“do-~as”名称)))
`(项目
(defmacro,do列表名称
(ls(&key、@(附加列表关键字)(id操作))和正文)
(带gensyms(el)
`(循环列表(,el,ls:id,id:operation,operation)
(let(XXX,@(build bind,name,el))
(当(,',过滤器-p,el)
(,'),带名称,el
,@body(()()()())))
在第一次通过后,我想获得:
(定义术语construct some-p(args name))
->
(项目
(DEFMACRO DO-SOME-LIST(LS(&KEY-ARGS-NAME-ID操作)和BODY)
(带-GENSYMS(EL)
`(循环列表(,EL,LS:ID,ID:OPERATION,OPERATION)
(LET(,@(BUILD-BIND,SOME,EL))
(当(某些-P,EL)
(有点,艾尔
,@BODY(()()()))
你知道我应该用什么引号/准引号来获得所需的代码吗?你说想要得到的输出有不平衡的逗号
,@
已经平衡了反向报价,因此您不能有、部分和、EL
。这是两个级别的取消引用/拼接,只有一个级别的反向引用
我怀疑你想要:
`(WITH-GENSYMS (EL) ... (LET (,@(BUILD-BIND 'SOME EL)) ...))
some
符号作为原始宏的参数输入,并在传递到build bind
函数时作为带引号的符号结束。EL
是直接计算的。它只是WITH-GENSYMS
绑定构造引入的一个局部变量,它不再位于反引号上下文中,因为它位于拼接内部
将其音译回原始外部宏的后引号:SOME
成为,name
:
,@(build-bind ',name el) ;; two commas out balance two backquotes in
符号拼接在保护报价的保护伞下,以确保它被视为符号而不是变量
el
无需拼接;它不是可变材料,而是生成的模板的硬编码特性。如果要放置,el
它将在定义术语构造
宏的范围中查找el
变量,其中不存在这样的内容。您应该更完整地显示代码。也就是说,包括所有宏的帮助函数,如do list name
等。do list name
将是由define term construct
生成的宏。我只是想知道如何在嵌套的准整数中输出拼接操作符。output symbol
就像(intern(format nil))
我接受了它。