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)
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. –
Ancak "clojure" ifadesinde, anahtar kelimeler, ör. '(: a {: a 36})'. O nasıl çalışır? – viebel
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 –