Clojure中,[]和'[]有什么区别?

3

最近我一直在学习Clojure,看到人们在不同的地方使用[], '[], ()和'()。在某些情况下,[]和'[]是可以互换的。

所以我想知道这两个符号之间的区别是什么?


我在《Clojure编程》第115页找到了这个有用的信息:“一个空列表不需要被引用,因为没有第一项可以被解释为可调用的值。” - user2524973
感谢评论! - Alex Gao
2个回答

7
''是读取器语法,它扩展为''。'quote'是一个特殊的形式,它表示“不要计算此表达式,而是将其视为文字处理”。例如,'x'会评估为'x'的值,而'‘x’'会评估为其名称为'“x”'的符号。
因此,'()'扩展为'(quote ())',这评估为'()'。对于'[]'也是如此。因此,在空列表和空向量上没有区别。
现在让我们考虑'(x)',它是'(quote(x))'。这评估为包含符号'x'的文字列表'(x)'。获得相同结果的另一种方法是评估'(list 'x)'。相反,评估'(x)'调用(或尝试调用)绑定到'x'的函数。
对于'['x']'与'[x]'也是类似的。

1
谁给这个点了踩,请解释一下为什么,因为我的理解大部分是相同的,而且显然我被误导了。 - D-side
我没有点踩,但第三段是错误的。'(x)' 的值为 (x),而不是 ('x'),后者是 ((quote x))。 - Leon Grapenthin
@LeonGrapenthin — 你说得对。我试图表达的是列表的内容被引用,但我表达得不够清楚。我会尝试修改以纠正这个问题。 - Nathan Davis
是的,我就是这么想的。很高兴你也同意 :)。 - Leon Grapenthin

4

请阅读有关引用的主题。

简而言之,'是一个阅读器宏,它扩展为(quote ..),因此'[]等于(quote [])

它的作用是抑制评估(即此处a未定义)

user=> (quote [a])
[a]

user=> '[a]
[a]

; the following will fails since "a" is not bound
; there is no way to construct an array where the 
; first element is the value of a
user=> [a] 
CompilerException java.lang.RuntimeException: 
 Unable to resolve symbol: a in this context, 
 compiling:(NO_SOURCE_PATH:0:0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接