Clojure函数在let绑定中

时间:2013-06-04 18:57:44

标签: function binding clojure let

如果我有一个评估函数的函数

(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))))

在第一种情况下,我担心在逐步减少时会生成x和y的新函数。

1 个答案:

答案 0 :(得分: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]))

希望它有所帮助。