在Lisp中@(at sign)的含义?

在Lisp中@(at sign)的含义?,lisp,common-lisp,Lisp,Common Lisp,你们都知道这个故事:程序员阅读别人的代码,程序员看到他们不理解的符号,谷歌失败了,因为很难搜索非字母数字符号 这次是@符号,它似乎用于将一个列表的内容注入到另一个列表的中间。例如: `(5 6 7 ,@'(8 9) 10 11) ;=> (5 6 7 8 9 10 11) 我对这个用法很满意,但我想知道我是否正确理解了@的行为?它还有其他用途吗?以下成绩单(来自CLISP)中的错误原因是什么 最后,什么是@?它似乎不是一个函数: [3]> (print #'@) *** - FU

你们都知道这个故事:程序员阅读别人的代码,程序员看到他们不理解的符号,谷歌失败了,因为很难搜索非字母数字符号

这次是
@
符号,它似乎用于将一个列表的内容注入到另一个列表的中间。例如:

`(5 6 7 ,@'(8 9) 10 11)
;=> (5 6 7 8 9 10 11)
我对这个用法很满意,但我想知道我是否正确理解了
@
的行为?它还有其他用途吗?以下成绩单(来自CLISP)中的错误原因是什么

最后,什么是
@
?它似乎不是一个函数:

[3]> (print #'@)

*** - FUNCTION: undefined function @

我猜这是一种基本语法,比如反引号(
`
)或逗号(
)。这是正确的吗?很抱歉,如果这是重复的,但就我所知,在CL中无法在列表拼接处搜索逗号。它将列表内容放入包含它的表达式中,删除列表的最外层。 保罗·格雷厄姆(Paul Graham)现在免费提供的书包含了更多关于它的细节,如果我的想法正确的话。如果你想了解更多关于高级Lisp的信息,这本书还是一本不错的读物。

“,@”用于在反引号中拼接… 在“反向报价”部分的HyperSpec中对其进行了描述:

如果逗号后面紧跟着at符号,则 在at符号之后进行求值以生成对象列表。这些 然后将对象“拼接”到模板中的适当位置。例如 如果
x
的值为
(a b c)
,则

 `(x ,x ,@x foo ,(cadr x) bar ,(cdr x) baz ,@(cdr x))
=>  (x (a b c) a b c foo b bar (b c) baz b c)
值得注意的是,@并不总是必要的;根据同一文件:

在任何可以使用“,@”的地方,可以使用语法“,.”来代替 指示允许在列表上进行破坏性操作 由“,”后面的形式生成的结构(实际上,要使用 NCOC而不是append)

…但“@”本身只是另一个字母… 你的直觉基本上是正确的,“所以基本上@本身并不意味着什么,唯一真正的运算符是,@?”
@
可以在其他地方作为普通字母使用。这就是为什么会出现您提到的错误:
(列表1 2 3 4@'(5 6 7))
只是

(list 1 2 3 4 @ '(5 6 7))
@
是一个变量,但这里没有值。与之相比:

(let ((@ 4.5))
  (list 1 2 3 4 @ '(5 6 7)))
;=> (1 2 3 4 4.5 (5 6 7))
…不幸的是,这可能很难找到。 对不起,如果这是一个重复,但再一次,据我所知,它是 无法搜索“@”


搜索某些非字母数字字符的文档可能会很困难,但我发现了一些技术可以提供帮助。例如,如果您访问lispdoc.com,您可以搜索
逗号
,并将返回到backquote。(虽然搜索at符号没有帮助。)这不是一个完美的解决方案,但有时会有所帮助。

,@
应被视为一个单独的实体,
,@
的含义是将以下表达式拼接到当前的准引号列表中

例如,您不能使用

`,@x
`(list ,@5)
由于准引号表达式不是列表,并且
,@
需要拼接到列表。 同样地(在我对标准的理解中),您不能使用

`,@x
`(list ,@5)
因为
5
不是一个列表(但是SBCL和CLISP都允许它并扩展到
(list.5)

编辑 实际上,SBCL和CLISP的行为是可以接受的,但是如果
,@
与非列表参数一起使用,则兼容实现给出错误也是可以接受的


`(,ab),c,@d)
的最后一个可能的扩展显示,为非列表引发错误也是可以接受的。

可能有用。@MikeChristensen这证实了我关于它的假设,但我仍然需要一些额外的解释。我发现,通过拼写出字符是什么,你实际上可以得到合理的谷歌搜索结果。例如,Google
Lisp“at sign”
@mbrach Good tip。谢谢。所以基本上,
@
本身并不意味着什么,唯一真正的操作符是
,@
?关于
`、@X
的行为的很好的说明,
X
不是一个列表!