Clojure 为什么对LazySeq应用seq返回ChunkedCons?

Clojure 为什么对LazySeq应用seq返回ChunkedCons?,clojure,Clojure,据我所知,LazySeq已经是一个序列,因为: (class (range 10)) ;=> clojure.lang.LazySeq (class (seq (range 10)) ;=> clojure.lang.ChunkedCons 我想我有答案了 这是因为使用seq强制执行LazySeq的第一个元素的求值。因为当集合和序列为空时,seq返回nil,所以它必须求值元素以确定该值 这正是为什么rest比next更懒的原因,因为(next s)只是(seq(rest s))来

据我所知,LazySeq已经是一个序列,因为:

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

(class (seq (range 10))
;=> clojure.lang.ChunkedCons

我想我有答案了

这是因为使用
seq
强制执行
LazySeq
的第一个元素的求值。因为当集合和序列为空时,
seq
返回
nil
,所以它必须求值元素以确定该值


这正是为什么
rest
next
更懒的原因,因为
(next s)
只是
(seq(rest s))
来扩展你的答案(并且因为注释不支持新行):

user=>(def r(范围10))
#'用户/r
用户=>(已实现?r)
假的
用户=>(类r)
clojure.lang.LazySeq
用户=>(def r2(剩余r))
#'用户/r2
用户=>(已实现?r2)
ClassCastException clojure.lang.ChunkedCons不能强制转换为clojure.lang.ipend clojure.core/realized?(核心clj:6607)
用户=>(r2类)
clojure.lang.ChunkedCons
用户=>(已实现?r)
真的
(seq? (range 10))
;=> true