6

私はlabreplを進めており、このパターンに従うコードを見ました。

;; Pattern
(apply #(apply f %&) coll)

;; Concrete example
user=> (apply #(apply + %&) [1 2 3 4])
10

これは、このパターンと同等のようです。

;; Pattern
(apply f coll)

;; Concrete example
user=> (apply + [1 2 3 4]) 
10

これらのパターンは同等ですか?そうでない場合、違いは何ですか?いつ使用しますか?

labreplのセルオートマトンラボのステップ関数から前者のパターンを取得しました。

(defn step
  "Advance the automation by one step, updating all cells."
  [board]
  (doall
   (map (fn [window]
          (apply #(apply map brians-brain-rules %&)
                 (doall (map torus-window window))))
        (torus-window board))))

更新:質問を明確にするために、各パターンの具体的な例を追加しました。

4

2 に答える 2

4

いいえ、違いはありません。長い形式で書く理由はありません。一度に意味のあるコードに徐々に変更を加えることによって到達したとしか思えません。

于 2012-10-07T01:07:51.290 に答える
0

基本的に、どちらの形式も同じことを達成し、多かれ少なかれ同じです。それぞれが無名関数を導入する方法を提供します。

Using#(...は、無名関数の Clojure リーダー省略形です。と同じようなものですが、無名関数を別の関数内(fn [arg1 & args]...に埋め込むことはできず、引数はベクトル バインディング ではなくまたはとして表現されます。#(...% %2...%1 %2...(fn [arg & args]

どちらも無名関数を表現するメソッドです。#(...はより単純な機能に(fn...使用され、 はより詳細な機能に使用されます。

#(...物事を少しきれいに見せる傾向があります。

于 2012-10-07T00:42:17.563 に答える