2010-12-16 19 views
6

Pratik Clojure'da (Bölüm 5) rseq işlev işleminin sabit zamanda yürütüldüğünü okuyordum. Bana doğrusal bir zaman çalışması olması gerektiği görünüyor. Benim için biraz ışık tutabilir mi?Sürekli Zamanda Clojure rseq?

cevap

12

bu deneyin:

(class [1 2 3 4])

Göreceksin:

clojure.lang.PersistentVector

Şimdi bu deneyin:

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

Ve dizisi imp ğu farklıdır: Roma bahsedilen olarak

clojure.lang.APersistentVector$RSeq

, bir sekansa değiştirilmiş bir arabirimdir. Tüm elemanlar, bulundukları yerdeyken tam tersi sırada onlara erişiyorlar.

Sen burada nasıl uygulandığı görmek için RSeq sınıf görebilirsiniz: Goran Jovic söyledi ama bunu baskı doğrusal gibi https://github.com/clojure/clojure/blob/b578c69d7480f621841ebcafdfa98e33fcb765f6/src/jvm/clojure/lang/APersistentVector.java

+0

Çok teşekkür ederim! Bu mantıklı. –

3

Nasıl uygulandığını bilmiyorum, ancak yalnızca sıra arabirimini uygulayan ve yapının (vektör veya sıralanmış harita) ters sırada nasıl geçeceğini bilen bir nesne döndürdüğünü düşünürdüm. Sonuç dizisi tembeldir, bu yüzden tüm yapıyı hemen geçmek zorunda kalmaz.

0

Bu sabit zamanda yeni arayüzü döndürür. Yani REPL içinde görüntülemek doğrusaldır, ancak bir def içine koymak sabittir.