懒惰序列的实现时序

ali*_*ice 5 clojure lazy-sequences

(defn square [x]
  (do
    (println (str "Processing: " x))
    (* x x)))

(println (map square '(1 2 3 4 5)))
Run Code Online (Sandbox Code Playgroud)

为什么输出

(Processing: 1 
Processing: 2 
1 Processing: 3 
4 Processing: 4 
9 Processing: 5 
16 25)
Run Code Online (Sandbox Code Playgroud)

(Processing: 1
1 Processing: 2
4 Processing: 3 
9 Processing: 4 
16 Processing: 5 
25)
Run Code Online (Sandbox Code Playgroud)

ali*_*ice 2

println在其实现中使用[[x & xs] xs]解构形式。这相当于并且比更不懒惰,因此它在打印第一项之前实现了这两项。[x (first xs), xs (next xs)]nextrest

例如,

=> (defn fn1 [[x & xs]] nil)
#'user/fn1
=> (fn1 (map square '(1 2 3 4 5)))
Processing: 1
Processing: 2
nil
Run Code Online (Sandbox Code Playgroud)