3

如果我有一个计算为函数的函数

(defn func1 [c1 c2]
  (fn [x1 x2]
    ...do some stuff with c1 c2 x1))

我在地图的其他地方使用或减少,使用内联更好吗

(defn func2 [x y z]
  (reduce (func1 x y) z (range 20)))

或者先绑定它

(defn func2 [x y z]
  (let [ffunc (func1 x y)]
    (reduce ffunc z (range 20))))

在第一种情况下,我会担心通过 reduce 的每一步都会生成一个超过 x 和 y 的新函数。

4

1 回答 1

3

(func1 x y)在每种情况下对函数调用进行一次评估。

Clojure 中对函数调用求值的规则包括求值作为其参数提供的所有表达式,然后使用这些值调用函数。

如果定义以下高阶函数:

(defn plus []
  (println "calling plus")
  +)

然后通过以下方式调用reduce:

(reduce (plus) [0 1 2 3])

打印一个单calling plus,显示该函数plus仅调用一次。

let使用表单时也会发生同样的事情:

(let [f (plus)]
  (reduce f [0 1 2 3]))

希望能帮助到你。

于 2013-06-04T19:40:04.753 回答