What is the difference between [] and '[] in Clojure
我最近一直在研究 Clojure,我看到人们在不同的地方使用 []、'[]、() 和 '()。在某些情况下,[] 和 '[] 可以互换。
所以我想知道这两个符号有什么不同?
- 我发现这很有帮助——来自 Clojure Progamming p115:"不需要引用我的空列表,因为没有第一项可以解释为可调用值"
-
感谢您的评论!
'<expr> 是扩展为 (quote <expr>) 的阅读器语法。 quote 是一种特殊的形式,它表示"不对这个表达式求值,而是把它当作一个文字来处理"。例如,x 求值为 x 的值,而 'x 求值为名称为 "x".
的符号
所以 '() 扩展为 (quote ()),其计算结果为 ()。 [] 也是如此。所以空列表和空向量没有区别。
现在让我们考虑'(x),即(quote (x))。这计算为 (x),它是一个包含符号 x 的文字列表。获得相同结果的另一种方法是评估 (list 'x)。相反,评估 (x) 调用(或尝试调用)绑定到 x.
的函数
'[x] 与 [x] 之间存在类似的论点。
- 无论谁对此投反对票,请务必解释原因,因为我的理解基本相同,而且我显然被误导了。
-
我没有投反对票,但第三段是错误的。 \\'(x) 计算结果为 (x),而不是 (\\'x),即 ((quote x))。
-
@LeonGrapenthin a€"你是对的。我试图传达引用列表内容的事实,但我做得不是很好。我会尝试提出一个编辑来纠正这个问题。
-
是的,我假设了这一点。很高兴你同意:)。
阅读主题 macros 和 quoting
简而言之 ' 是一个扩展为 (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) |