Clojure 中的 [] 和 \\'[] 有什么区别

What is the difference between [] and '[] in Clojure

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

所以我想知道这两个符号有什么不同?


'<expr> 是扩展为 (quote <expr>) 的阅读器语法。 quote 是一种特殊的形式,它表示"不对这个表达式求值,而是把它当作一个文字来处理"。例如,x 求值为 x 的值,而 'x 求值为名称为 "x".

的符号

所以 '() 扩展为 (quote ()),其计算结果为 ()[] 也是如此。所以空列表和空向量没有区别。

现在让我们考虑'(x),即(quote (x))。这计算为 (x),它是一个包含符号 x 的文字列表。获得相同结果的另一种方法是评估 (list 'x)。相反,评估 (x) 调用(或尝试调用)绑定到 x.

的函数

'[x][x] 之间存在类似的论点。


阅读主题 macrosquoting

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

它做了什么 - 它抑制了评估(即这里 a 没有定义)

1
2
3
4
5
6
7
8
9
10
11
12
13
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)