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