如果我有一个评估函数的函数
(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的新函数。
答案 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]))
希望它有所帮助。