Clojure rseq在恒定时间?

Ron*_*ell 6 clojure

我正在阅读Practical Clojure(第5章),rseq函数操作在恒定时间内执行.在我看来,它应该是线性时间操作.任何人都可以为我阐明这一点吗?

Gor*_*vic 12

试试这个:

(class [1 2 3 4])

你会看到的:

clojure.lang.PersistentVector

现在试试这个:

(class (rseq [1 2 3 4]))

顺序实现是不同的:

clojure.lang.APersistentVector$RSeq

正如Roman所说,它是一个改变了序列的接口.所有元素都是他们只是以相反的顺序访问它们的地方.

您可以RSeq在此处查看类以了解它是如何实现的:https://github.com/clojure/clojure/blob/b578c69d7480f621841ebcafdfa98e33fcb765f6/src/jvm/clojure/lang/APersistentVector.java