为什么在LazySeq上应用seq会返回ChunkedCons?

M. *_*ong 5 clojure

(class (range 10))
;=> clojure.lang.LazySeq

(class (seq (range 10))
;=> clojure.lang.ChunkedCons
Run Code Online (Sandbox Code Playgroud)

据我了解,LazySeq已经是一个序列,因为:

(seq? (range 10))
;=> true
Run Code Online (Sandbox Code Playgroud)

M. *_*ong 1

我想我已经有了答案。

这是因为 usingseq强制评估 的第一个元素LazySeq。因为当集合和序列为空时seq返回,所以它必须评估元素来决定。nil

这就是为什么rest比 更懒的原因next,因为(next s)只是(seq (rest s))