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)各ケースで 1 回行われます。

Clojure で関数呼び出しを評価するためのルールは、引数として提供されるすべての式を評価し、それらの値を使用して関数を呼び出すことで構成されます。

次の高階関数を定義すると:

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

次に、次の方法で reduce を呼び出します。

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

シングルcalling plusが出力され、関数plusが 1 回だけ呼び出されることを示します。

letフォームを使用する場合も同じことが起こります。

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

それが役に立てば幸い。

于 2013-06-04T19:40:04.753 に答える