(class (range 10))
;=> clojure.lang.LazySeq
(class (seq (range 10))
;=> clojure.lang.ChunkedCons
私の理解では、LazySeq はすでにシーケンスです。
(seq? (range 10))
;=> true
(class (range 10))
;=> clojure.lang.LazySeq
(class (seq (range 10))
;=> clojure.lang.ChunkedCons
私の理解では、LazySeq はすでにシーケンスです。
(seq? (range 10))
;=> true
回答を拡張するには(コメントは改行をサポートしていないため):
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
私は答えを持っていると思います。
これは、 usingseq
が の最初の要素の評価を強制するためですLazySeq
。コレクションとシーケンスが空のときにseq
戻るため、それを決定するために要素を評価する必要があります。nil
rest
それが が よりも怠惰next
な理由(next s)
です(seq (rest s))
。