2014-07-26 21 views
5

David Nolen'in ClojureScript konusundaki konuşmasını gördüm, burada IFN'yi Regexp'e genişletiyor ve böylece eşleşmeleri kontrol etmek için bir dizgede bir regex hazır kelimesini fuinction olarak çağırabiliyoruz.Neden genişletme türünü kullanarak Clojure'ın IFn'sini genişletemiyorum?

Düzenli Clojure'da Strings ile benzer bir şey denedim, ancak bu özel durumu anladım. IFn'nin Java'da yazılan bir arayüz olduğunu, ancak uygulamanın CLojrue cephesinde nasıl çalıştığını görüyorum.

(extend-type java.lang.String 
    #_=> clojure.lang.IFn 
    #_=> (-invoke 
    #_=> ([this index] 
    #_=>  (get (seq this) index)))) 
IllegalArgumentException interface clojure.lang.IFn is not a protocol clojure.core/extend (core_deftype.clj:742) 

cevap

6

Kural dışı durum size bir ipucu vermelidir. IFn, Clojure'da bir protokol değildir. ClojureScript'te. extend protokollerini, Java arayüzlerini ve alt sınıf sınıflarını uygulayabilirsiniz. Bu durumda, final olarak bildirildiğinden java.lang.String alt sınıfını bile kullanamazsınız.

+1

Bu durumda en iyi bahis, sadece java.lang.String dosyasını silen ve tüm çağrıları -invoke dışında geçiren ve IFN'yi uygulayan yeni bir tür olurdu. –

+0

Ancak "clojure" ifadesinde, anahtar kelimeler, ör. '(: a {: a 36})'. O nasıl çalışır? – viebel

+0

Anahtar kelimeler Java'da uygulanmaktadır, böylece IFn arayüzünden miras alınabilir, https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Keyword.java –

İlgili konular