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 |
Education > Closer to Clojure >