高阶函数中的Clojure运算符

rob*_*rit 0 clojure

我整理了一个高阶函数,在某些情况下会调用函数参数,但是根据函数的不同,它似乎会有不同的效果。我能够通过一个简单的函数重现相同的行为:

(defn foo [f a b] (f a b))
Run Code Online (Sandbox Code Playgroud)

对于“正常”功能,它可以正常工作:

user=> (foo list 2 3)
(2 3)
user=> (foo cons 1 '(2 3))
(1 2 3)
user=> (foo println 2 3)
2 3
nil
Run Code Online (Sandbox Code Playgroud)

但是对于运算符,它没有,它似乎只返回最后一个元素:

user=> (foo '+ 2 3)
3
user=> (foo '* 2 3)
3
user=> (foo '- 2 3)
3
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?

Tay*_*ood 6

user=> (foo '+ 2 3)
3
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?

'(或quote)正在创造一个符号+时候你想要的+函数值本身:https://clojure.org/guides/weird_characters#_quote

(quote foo) => foo ;; symbol
'foo => foo ;; symbol
Run Code Online (Sandbox Code Playgroud)

因此,始终返回第二个参数的行为来自以下事实:符号(如关键字)也充当函数,通常用作get关联结构(如地图)的简写,因此它们在功能上是等效的:

('foo 1 2) => 2
(get 1 'foo 2) => 2
Run Code Online (Sandbox Code Playgroud)

2恰好是在用于位置默认值时,所述钥匙没有在的缔合结构中。

如果您有一个带有符号键的地图,这将非常有用,就像关键字:

('foo {'foo 1}) => 1
({'foo 1} 'foo) => 1
('foo {'bar 1} 2) => 2
Run Code Online (Sandbox Code Playgroud)