我试图了解 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!”。有没有办法管理它?无论如何,继续进行毫无疑问只需要一次评估的事情:
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 的开头而不必了解整个事情。这是怎么回事?