Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 使用嵌套的准序列化编写Lisp宏_Macros_Lisp - Fatal编程技术网

Macros 使用嵌套的准序列化编写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

我正试图编写一个Lisp宏来编写一组宏,但在生成宏代码时遇到了一些问题,这些宏代码使用了首先在表达式内部展开的拼接操作符(内部构建绑定)

(定义术语构造(名称过滤器-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))
我接受了它。