SORU
9 HAZİRAN 2010, ÇARŞAMBA


Clojure: eksileri(seq) vs conj(liste)

cons seq verir ve conj koleksiyon döndüren biliyorum. I conj "koleksiyonu en son madde ve cons her zaman" "ön öğesi ekler." diyor o da biliyor Bu örnek, bu noktaların her ikisini de gösterir:

user=> (conj [1 2 3] 4) //returns a collection
[1 2 3 4]
user=> (cons 4 [1 2 3]) //returns a seq
(4 1 2 3)

Vektörler, haritalar ve ayarlar için bu farklar bana mantıklı geliyor. Ancak, listeler için aynı görünüyorlar.

user=> (conj (list 3 2 1) 4) //returns a list
(4 3 2 1)
user=> (cons 4 (list 3 2 1)) //returns a seq
(4 3 2 1)

Herhangi bir örnek conj vs cons farklı davranışlar sergilemek, ya da onlar gerçekten değiştirilebilir olduğu listeler kullanan var mı? Bir liste ve seq olamaz benzer şekilde kullanılan bir örnek olduğunu ifade farklı?

CEVAP
9 HAZİRAN 2010, ÇARŞAMBA


Tek fark conj cons sadece bir alırken bir koleksiyonuna eklemek için herhangi bir sayıda argümanı kabul eder:

(conj '(1 2 3) 4 5 6)
; => (6 5 4 1 2 3)

(cons 4 5 6 '(1 2 3))
; => IllegalArgumentException due to wrong arity

Başka bir fark dönüş değeri: sınıf

(class (conj '(1 2 3) 4))
; => clojure.lang.PersistentList

(class (cons 4 '(1 2 3))
; => clojure.lang.Cons

Not bu değil gerçekten değiştirilebilir; özel, clojure.lang.Cons uygulamıyor clojure.lang.Counted count artık bir sabit zaman çalışma (bu durumda olurdu muhtemelen azaltmak için 1 3-1 geliyor doğrusal geçişi üzerinde ilk eleman 3 geliyor (next (cons 4 '(1 2 3)) olmak PersistentList ve böylece Counted).

Adları arkasındaki niyeti cons cons(truct bir seq) anlamına geldiğini sanıyorum1, conj anlamına gelir, oysa conj(bir koleksiyon üzerine bir öğe oin). seq varlık inşa cons ile başlar unsuru olarak geçirilen ilk bağımsız değişken ve sahip next / rest bölüm şeyin kaynaklanan uygulama seq ikinci argüman; olarak görüntülenen yukarıda, her şey sınıf clojure.lang.Cons. Buna karşılık, conj her zaman toplama geçirilen yaklaşık olarak aynı türden bir koleksiyon döndürür. Çünkü (kabaca, PersistentArrayMap PersistentHashMap 9 içine girdiler ötesinde büyür en kısa sürede açılır.)


1Geleneksel olarak, Lisp dünya cons cons(tructs bir çift), Clojure yola gelen Lisp geleneğine sahip cons fonksiyonu inşa bir seq olan yok bir geleneksel cdr. Bu genel kullanım cons demek "yapısı bir kayıt bir tür veya başka bir sayı değerlerini birlikte" şu anda her yerde bu çalışmada, programlama dilleri ve bunların uygulanması; bu da ne demek "kaçınarak consing" geçmektedir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Philip DeFranco

    Philip DeFra

    16 EYLÜL 2006
  • The Amazing Atheist

    The Amazing

    20 Kasım 2006
  • TheTwistedFrequency

    TheTwistedFr

    26 NİSAN 2010