2010-12-16 12 views
6

私はPractical Clojure(第5章)で、rseq関数の演算が一定の時間内に実行されていると読んでいました。それは私には線形時間操作でなければならないと思われる。誰も私のためにこれについていくつかの光を当てることができますか?Clojure rseqは一定時間ですか?

答えて

12

これを試してみてください:

(class [1 2 3 4])

あなたが表示されます:

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

とシーケンスIMP:

clojure.lang.PersistentVector

今これを試してくださいlementationは異なっている:ローマが言ったように

clojure.lang.APersistentVector$RSeq

は、それが配列に変更されたインターフェースです。すべての要素は、逆の順序でアクセスしている場所です。あなたはそれがここに実現しています方法を確認するためにRSeqクラスを参照してくださいすることができます

https://github.com/clojure/clojure/blob/b578c69d7480f621841ebcafdfa98e33fcb765f6/src/jvm/clojure/lang/APersistentVector.java

+0

ありがとうございました!それは理にかなっている。 –

3

私はそれがどのように実装されているのかわかりませんが、シーケンスインターフェイスを実装し、逆の順序で構造(ベクトルまたはソートマップ)をトラバースする方法を知っているオブジェクトを返すと思います。結果シーケンスは怠惰なので、すぐに構造全体を走査する必要はありません。

0

それはゴランJovicが言ったように、一定時間内に新しいインターフェースを返しますが、それをプリントアウトすることは線形です。 REPLにそれを表示することは線形ですが、defに入れるのは定数です。

関連する問題