私は、clojure の遅延シーケンスがいつ遅延するのか、いつ作業が行われるのか、そしてそれらにどのように影響を与えることができるのかを理解しようとしています。
user=> (def lz-seq (map #(do (println "fn call!") (identity %)) (range 4)))
#'user/lz-seq
user=> (let [[a b] lz-seq])
fn call!
fn call!
fn call!
fn call!
nil
ここで「fn call!」が 2 つだけ表示されることを期待していました。それを管理する方法はありますか?とにかく、議論の余地なく 1 つの評価しか必要としないものに移ります。
user=> (def lz-seq (map #(do (println "fn call!") (identity %)) (range 4)))
#'user/lz-seq
user=> (first lz-seq)
fn call!
fn call!
fn call!
fn call!
0
first
遅延シーケンスには適していませんか?
user=> (def lz-seq (map #(do (println "fn call!") (identity %)) (range 4)))
#'user/lz-seq
user=> (take 1 lz-seq)
(fn call!
fn call!
fn call!
fn call!
0)
この時点で、すべてを理解することなく、おもちゃの lz-seq の先頭にアクセスする方法について完全に途方に暮れています。どうしたの?