高阶函数中的 Clojure 运算符



我把一个高阶函数放在一起,在某些情况下调用函数参数,但它似乎根据函数有不同的效果。我只需一个简单的函数就能重现相同的行为:

(defn foo [f a b] (f a b))

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

user=> (foo list 2 3)
(2 3)
user=> (foo cons 1 '(2 3))
(1 2 3)
user=> (foo println 2 3)
2 3
nil

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

user=> (foo '+ 2 3)
3
user=> (foo '* 2 3)
3
user=> (foo '- 2 3)
3

为什么会这样呢?

user=> (foo '+ 2 3)
3

为什么会这样呢?

'(或quote(是创建一个+符号,当你需要+函数值本身时:https://clojure.org/guides/weird_characters#_quote

(quote foo) => foo ;; symbol
'foo => foo ;; symbol

因此,始终返回第二个参数的行为来自这样一个事实,即符号(如关键字(也充当函数,通常用作关联结构(如映射(上get的简写,因此这些在功能上是等价的:

('foo 1 2) => 2
(get 1 'foo 2) => 2

当在关联结构中找不到键时,2恰好位于用于默认值的位置。

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

('foo {'foo 1}) => 1
({'foo 1} 'foo) => 1
('foo {'bar 1} 2) => 2

在 clojure 中,像+这样的"运算符"只是普通函数。 不要使用单引号,它会正常工作。

(ns tst.demo.core
(:use tupelo.core tupelo.test))
(defn foo [f a b] (f a b))
(dotest
(spyx (foo list 2 3))
(spyx (foo println 2 3))
(spyx (foo + 2 3))
(spyx (foo * 2 3))
(spyx (foo - 2 3)) )

结果:

(foo list 2 3) => (2 3)
2 3                        ; result of (println 2 3)
(foo println 2 3) => nil   ; println always returns `nil`
(foo + 2 3) => 5
(foo * 2 3) => 6
(foo - 2 3) => -1

帮助程序函数spyx只打印表达式,然后打印其值。

最新更新