我正在阅读Practical Clojure(第5章),rseq
函数操作在恒定时间内执行。在我看来,它应该是线性时间操作。任何人都可以为我阐明这一点吗?
答案 0 :(得分: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
答案 1 :(得分:3)
我不知道它是如何实现的,但我认为它只返回一些实现序列接口的对象,并且知道如何以相反的顺序遍历结构(向量或有序映射)。结果序列是惰性的,因此它不必立即遍历整个结构。
答案 2 :(得分:0)
它像Goran Jovic所说的那样在恒定时间内返回新界面,但是将其打印出来是线性的。因此在REPL中显示它是线性的,但将它放在def中是不变的。