Education‎ > ‎Closer to Clojure‎ > ‎

Closer to Clojure 04: Lazy evaluation

Most sequences are lazily evaluated. Function cycle loops sequence infinitely.

user=> (take 15 (cycle [1 2 3 4]))
(1 2 3 4 1 2 3 4 1 2 3 4 1 2 3)

You can create lazy-evaluation function by a macro lazy-seq. The next code shows simplified version of take.

(defn take [n coll]
  (lazy-seq
    (when (pos? n)
      (when-let [s (seq coll)]
        (cons (first s) (take (dec n) (rest s))))))

Reference:
http://clojure.org/functional_programming
多くのシーケンスは遅延評価されます.関数cycleはシーケンスを無限循環させます.

user=> (take 15 (cycle [1 2 3 4]))
(1 2 3 4 1 2 3 4 1 2 3 4 1 2 3)

lazy-seqマクロを使えば,遅延評価関数を作れます.次の例はtakeの定義を簡略化したものです.

(defn take [n coll]
  (lazy-seq
    (when (pos? n)
      (when-let [s (seq coll)]
        (cons (first s) (take (dec n) (rest s))))))

参考
http://clojure.org/functional_programming
Comments