2010-12-16 68 views
6

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

回答

12

试试这个:

(class [1 2 3 4])

你会看到:

clojure.lang.PersistentVector

现在试试这个:

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

和顺序小鬼lementation是不同的:

clojure.lang.APersistentVector$RSeq

正如罗曼说,这是一个改变接口的序列。所有的元素都是他们所在的地方,你只是以相反的顺序访问它们。

你可以看到RSeq类,看看它是如何在这里实现:https://github.com/clojure/clojure/blob/b578c69d7480f621841ebcafdfa98e33fcb765f6/src/jvm/clojure/lang/APersistentVector.java

+0

非常感谢!这就说得通了。 – 2010-12-16 16:06:59

3

我不知道它是如何实现的,但我认为它只是返回一些实现序列接口的对象,并知道如何以相反的顺序遍历结构(向量或有序映射)。结果序列是懒惰的,所以它不必立即遍历整个结构。

0

它返回新界面在固定时间内像戈兰约维奇说,但打印出来是线性的。因此,在REPL中显示它是线性的,但将其置于def是恒定的。