为什么 (map (fn [f] (f 0)) `(inc)) 在 Clojure 中返回 (nil)

aQu*_*Qua 1 clojure

uesr=> (defn ff [f] (f 0))\nuesr=> (ff inc)\n1\nuesr=> (map ff `(inc))\n(nil)\n
Run Code Online (Sandbox Code Playgroud)\n

为什么ff在map \xef\xbc\x9f中表现不好

\n

Mar*_*ůda 5

看看传入了什么map

(map #(println %1) '(inc))
inc
=> (nil)

(map #(println %1) `(inc))
clojure.core/inc
=> (nil)
Run Code Online (Sandbox Code Playgroud)

两者inc都在引号内,因此它们不会评估功能。在第二个示例中,使用了语法引号inc,因此解析为完全限定的符号。

现在你的代码:

(defn ff [f] (f 0))

(map ff `(inc))
=> nil
Run Code Online (Sandbox Code Playgroud)

您的函数计算结果为:

('inc 0)
=> nil

('clojure.core/inc 0)
=> nil
Run Code Online (Sandbox Code Playgroud)

符号在对象中查找自身:

('inc {'inc 1 'dec 2})
=> 1
('inc #{'inc 'dec})
=> inc
Run Code Online (Sandbox Code Playgroud)

'inc未在 中找到0,因此nil返回(您甚至可以添加not-found参数)。

('inc 0)
=> nil

('inc 0 1)
=> 1
Run Code Online (Sandbox Code Playgroud)

要获得您想要的结果,请使用list或向量:

(map #(println %1) [inc])
#object[clojure.core$inc 0x4fa1f07 clojure.core$inc@4fa1f07]
=> (nil)

(map #(%1 0) (list inc))
=> (1)

(map #(%1 0) [inc])
=> (1)
Run Code Online (Sandbox Code Playgroud)