我最近一直在研究Clojure,我看到人们在不同的地方使用[],' [],()和'()。在某些情况下,[]和' []是可以互换的。
所以我想知道这两个符号之间有什么不同?
答案 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)
阅读主题macros
和quoting
简而言之'
是一个读者宏,它扩展为(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)