Clojure向量前何时需要撇号
摘自《Clojure的快乐》一书: 第一个例子:Clojure向量前何时需要撇号,clojure,apostrophe,Clojure,Apostrophe,摘自《Clojure的快乐》一书: 第一个例子: (def fifth (comp first rest rest rest rest)) (fifth [1 2 3 4 5]) ;=> e 第二个例子: (defn fnth [n] (apply comp (cons first (take (dec n) (repeat rest))))) ((fnth 5) '[a b c d e]) ;=> e 为什么在第二个例子中(但不是在第一个例子中)我需要一
(def fifth (comp first rest rest rest rest))
(fifth [1 2 3 4 5])
;=> e
第二个例子:
(defn fnth [n]
(apply comp
(cons first
(take (dec n) (repeat rest)))))
((fnth 5) '[a b c d e])
;=> e
为什么在第二个例子中(但不是在第一个例子中)我需要一个撇号?如果没有撇号,第二个示例将产生错误。在第二个示例中,您必须使用撇号,因为您希望阻止对向量元素的求值。如果删除撇号,Clojure将尝试解析符号
a
、b
等,就好像它们绑定到某些值一样
例如:
user> '[a b c d e]
;; => [a b c d e]
user> [a b c d e]
CompilerException java.lang.RuntimeException: Unable to resolve symbol: a
user> (let [a 1
b 2
c 3
d 4
e 5]
[a b c d e])
;; => [1 2 3 4 5]
请注意,您不必将aphostrophe与数字一起使用,因为它们会自行评估:
user> 1
;; => 1
user> 2
;; => 2
user> [1 2 3]
;; => [1 2 3]
虽然符号没有,但Clojure将搜索给定符号绑定到的值:
user> x
CompilerException java.lang.RuntimeException: Unable to resolve symbol: x
因此,了解这些信息以及函数的参数在进入函数之前进行求值这一事实,就应该清楚为什么以及何时在向量之前使用撇号。在第二个示例中,引号
“
用于防止求值器在向量之后求值表单(向量)
其中的符号不是自我评估的(请在此处阅读更多内容),评估者会尝试解决这些问题
例如
(def foo 42)
[foo]
=> [42] ;; vector with number 42, resolved via foo
'[foo]
=> [foo] ;; vector with the symbol foo, decoupled from the var foo
您可能想在此处阅读另一个quote
示例,并在此处深入了解阅读器和语法引用: