我很困惑逗号-逗号-at是怎么做到的。
在在定义Lisp宏时,是否使用双引号(双逗号)?中使用逗号-逗号-at的示例
在我看来
(let ((parms '(x y)))
``(beg ,,@parms end))扩展到或相当于
`(beg ,x ,y end)它是如何扩展到这一点的呢?
我在想,如果我评估双引号形式,它会导致第二个逗号完成它的工作,结果是:
`(beg ,<splice stuff here> end)看起来Lisp解释器应该抱怨并说:“我不知道在逗号前拼接东西意味着什么”,也就是说,当Lisp遇到
`,@abc它很可能会说:“我不知道在引用前把东西拼接在一起意味着什么。不要再这样做了。”
但不知何故,翻译并没有抱怨,只是选择了。
`(beg <splice stuff here and write comma in front of each of them> end)这与CLHS反向报价中的规则兼容吗?
对于读者的信息,答案后面的评论引用了答案的旧版本,并导致了答案的更新。新读者不需要阅读评论。
发布于 2013-07-30 21:24:01
CLHS声明:“如果反引号语法是嵌套的,则应该首先展开最内部的反引号形式。这意味着,如果一行中出现了几个逗号,则最左边的一个属于最内部的反引号。”
因此,第一个逗号取消引用第二个反引号;然后,@连接到parms的内容中,因为所有引号都已取消。取消引用并不像您所描述的那样在步骤中“替换”表单--在决定如何计算包含的表单时,只需在反引号表单的结构中备份逗号。
(let ((parms '(x y)))
`(list 'beg ,@parms 'end))显然,计算结果是(list 'beg x y 'end),这就是您在这里所追求的;生成一个创建所需结构作为其输出的表单。附加的外部引号只是这个语法的简写,其方式与'(foo bar) (除等式问题外)是(list 'foo 'bar)的缩写相同。
https://stackoverflow.com/questions/17957393
复制相似问题