Function let绑定中的Clojure函数

Function let绑定中的Clojure函数,function,binding,clojure,let,Function,Binding,Clojure,Let,如果我有一个计算为函数的函数 (defn func1 [c1 c2] (fn [x1 x2] ...do some stuff with c1 c2 x1)) 我在地图或reduce的其他地方使用的,使用内联是不是更好 (defn func2 [x y z] (reduce (func1 x y) z (range 20))) 还是让我先把它绑起来 (defn func2 [x y z] (let [ffunc (func1 x y)] (reduce ffunc

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

(defn func1 [c1 c2]
  (fn [x1 x2]
    ...do some stuff with c1 c2 x1))
我在地图或reduce的其他地方使用的,使用内联是不是更好

(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上的新函数。

函数调用的求值
(func1 x y)
在每种情况下都会执行一次

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

如果定义以下高阶函数:

(defn plus []
  (println "calling plus")
  +)
然后按以下方式调用reduce:

(reduce (plus) [0 1 2 3])
打印一个
调用plus
,显示只调用一次函数
plus

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

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

希望有帮助。

是的,这正是我想要的。从来没有想过用副作用来测试它。谢谢。还要注意的是,实例化函数通常很便宜,所以即使分配了多个函数,也没什么大不了的。显然,您可以构造代价高昂的函数,但并不是每次都要重新编译函数(我提到这一点是因为新来闭包的人通常在每次构造闭包时都会编译它们)。