Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure向量前何时需要撇号_Clojure_Apostrophe - Fatal编程技术网

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 为什么在第二个例子中(但不是在第一个例子中)我需要一

摘自《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

为什么在第二个例子中(但不是在第一个例子中)我需要一个撇号?如果没有撇号,第二个示例将产生错误。

在第二个示例中,您必须使用撇号,因为您希望阻止对向量元素的求值。如果删除撇号,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
示例,并在此处深入了解阅读器和语法引用: