2

私は今Programming Clojureを読んでいて、次の例を見つけました

(defn by-pairs [coll]
  (let
    [take-pair (fn [c] (when (next c) (take 2 c)))]
    (lazy-seq
      (when-let [pair (seq (take-pair coll))] ;seq calls here
        (cons pair (by-pairs (rest coll)))))))

次のように、リストをペアに分割します

(println (by-pairs  [1 2 1]))     ((1 2) (2 1))
(println (by-pairs  [1 2 1 3]))   ((1 2) (2 1) (1 3))
(println (by-pairs  []))          ()
(println (by-pairs  [1]))         ()

私が得ることができないのは、テイクペアの結果で seq を呼び出す必要があるのはなぜですか? では、なぜ私たちはただ書くことができないのか

(defn by-pairs [coll]
  (let
    [take-pair (fn [c] (when (next c) (take 2 c)))]
    (lazy-seq
      (when-let [pair (take-pair coll)]
        (cons pair (by-pairs (rest coll)))))))

魔女の場合、結果は異なりますか、それともパフォーマンス上の理由がありますか?

4

1 に答える 1

2

両方のコードは同じであり、関数内のcoll に適用されている関数は、渡されたパラメーターを呼び出すためnext、違いはありません。つまり、最初に c を呼び出すか、実装されているオブジェクトであるかどうかを確認しようとします。関数で行います。したがって、基本的にこの場合、自分自身を呼び出さない場合、andはそれを呼び出します。taketake-pairseqnext cseqISeqtakeseqnexttakeseq

于 2012-07-21T17:46:31.600 に答える