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)
?
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)