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

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

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

(seq? (range 10))
;=> true
4

2 回答 2

1

我想我有一个答案。

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

rest这就是为什么is 比 更懒惰的确切原因next,因为(next s)is just (seq (rest s))

于 2012-09-14T16:48:54.813 回答
1

要扩展您的答案(并且因为评论不支持新行):

user=> (def r (range 10))
#'user/r
user=> (realized? r)
false
user=> (class r)
clojure.lang.LazySeq
user=> (def r2 (rest r))
#'user/r2
user=> (realized? r2)
ClassCastException clojure.lang.ChunkedCons cannot be cast to clojure.lang.IPending  clojure.core/realized? (core.clj:6607)
user=> (class r2)
clojure.lang.ChunkedCons
user=> (realized? r)
true
于 2012-09-14T16:58:00.260 回答