Clojure 为什么对LazySeq应用seq返回ChunkedCons?
据我所知,LazySeq已经是一个序列,因为: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))来
(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