2010-12-16 66 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是恆定的。