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

  • Adam Washington

    Adam Washing

    12 Mayıs 2006
  • fufko

    fufko

    27 ŞUBAT 2006
  • Sergio Lafuente Rubio

    Sergio Lafue

    11 Aralık 2008