SORU
22 AĞUSTOS 2011, PAZARTESİ


Neden Clojure sadece bir yerine bir sınıf tanımlamak için 5 yolu var mı?

Clojure gen-sınıf, reify, proxy ve ayrıca deftype ve defrecord sınıf gibi yeni veri türlerini tanımlamak için. Sözdizimsel basitlik değerleri ve gereksiz karmaşıklığı iğrendiği bir dil için, bir istisna gibi görünüyor. Biri bunu açıklayabilir mi? Lisp tarzı defclass Ortak yeterli olabilir mi?

CEVAP
22 AĞUSTOS 2011, PAZARTESİ


Bu üç farklı faktörlerin bir karışımı

  1. Özellikle yazın jvm sistem
  2. Türleri tanımlarken farklı kullanım durumları için biraz farklı semantiği gerek
  3. Bunlardan bazıları dili gelişmiştir gibi daha önce, ve biraz daha gelişmiş olması.

Bu yüzden ilk olarak, bu ne göz önünde bulundurun.deftypevegen-sınıfıonlar zamanından önce derleme. adında bir sınıf tanımlar hem de bu benzer Gen-birinci sınıf, clojure 1.2 deftype izledi. Deftype tercih edilir ve daha iyi performans özelliklere sahiptir, ama daha kısıtlayıcıdır. Deftype bir sınıf bir arabirim için uygun olabilir, ancak başka bir sınıftan miras alır.

Reifyveproxyher ikisi için kullanılır dinamik olarak çalışma zamanında bir anonim sınıfının bir örneğini oluşturun. Proxy birinci geldi, reify deftype ile birlikte geldi ve clojure 1.2 defrecord. Reify deftype semantiği çok kısıtlayıcı değil, sadece olarak tercih edilmektedir.

Aynı zamanda ortaya çıktı, ve benzer bir role sahip olduğundan, her iki deftype ve defrecord neden soru bırakır. Bildiğimiz çeşitli clojure iyilik ve sevgi, sequability hepsi var ve benzeri. defrecord kullanmak isteyeceksiniz birçok amaç için: Deftype diğer datastructures uygulanması için düşük seviyeli bir yapı taşı olarak kullanılmak üzere tasarlanmıştır. Düzenli clojure arabirimleri içermez, ama değişken alanların bu seçenek öntanımlı değildir olsa) var.

Daha fazla okuma kontrol için:

The clojure.org datatypes page

The google group thread where deftype and reify were introduced

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Garrett Müller

    Garrett Mül

    26 HAZİRAN 2009
  • magnum33563

    magnum33563

    8 NİSAN 2011
  • Rickymon Tero

    Rickymon Ter

    1 Ocak 2007