首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逗号-逗号-在通用Lisp中

逗号-逗号-在通用Lisp中
EN

Stack Overflow用户
提问于 2013-07-30 21:06:01
回答 1查看 1.9K关注 0票数 4

我很困惑逗号-逗号-at是怎么做到的。

在定义Lisp宏时,是否使用双引号(双逗号)?中使用逗号-逗号-at的示例

在我看来

代码语言:javascript
复制
(let ((parms '(x y)))
  ``(beg ,,@parms end))

扩展到或相当于

代码语言:javascript
复制
`(beg ,x ,y end)

它是如何扩展到这一点的呢?

我在想,如果我评估双引号形式,它会导致第二个逗号完成它的工作,结果是:

代码语言:javascript
复制
`(beg ,<splice stuff here> end)

看起来Lisp解释器应该抱怨并说:“我不知道在逗号前拼接东西意味着什么”,也就是说,当Lisp遇到

代码语言:javascript
复制
`,@abc

它很可能会说:“我不知道在引用前把东西拼接在一起意味着什么。不要再这样做了。”

但不知何故,翻译并没有抱怨,只是选择了。

代码语言:javascript
复制
`(beg <splice stuff here and write comma in front of each of them> end)

这与CLHS反向报价中的规则兼容吗?

对于读者的信息,答案后面的评论引用了答案的旧版本,并导致了答案的更新。新读者不需要阅读评论。

还请参见CHLS“最里面的后引文形式应先扩展”的意思

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-30 21:24:01

CLHS声明:“如果反引号语法是嵌套的,则应该首先展开最内部的反引号形式。这意味着,如果一行中出现了几个逗号,则最左边的一个属于最内部的反引号。”

因此,第一个逗号取消引用第二个反引号;然后,@连接到parms的内容中,因为所有引号都已取消。取消引用并不像您所描述的那样在步骤中“替换”表单--在决定如何计算包含的表单时,只需在反引号表单的结构中备份逗号。

代码语言:javascript
复制
(let ((parms '(x y)))
  `(list 'beg ,@parms 'end))

显然,计算结果是(list 'beg x y 'end),这就是您在这里所追求的;生成一个创建所需结构作为其输出的表单。附加的外部引号只是这个语法的简写,其方式与'(foo bar) (除等式问题外)是(list 'foo 'bar)的缩写相同。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17957393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档