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

时间:2015-08-25 14:35:52

标签: clojure

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

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

2 个答案:

答案 0 :(得分:5)

'<expr>是扩展为(quote <expr>)的读者语法。 quote是一种特殊形式,表示不会评估此表达式,而是将其视为文字。&#34;例如,x评估为x的值,而'x评估为名称为"x"的符号。

因此'()扩展为(quote ()),其评估为()。同样适用于[]。因此列表和向量没有区别。

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

类似的论点适用于'[x][x]

答案 1 :(得分:4)

阅读主题macrosquoting

简而言之'是一个读者宏,它扩展为(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)