2014-07-26 9 views
5

मैंने क्लोजरस्क्रिप्ट पर डेविड नोलन की बात देखी जहां वह आईएफएन को रेगेक्सपी तक बढ़ाता है और ताकि हम मैचों की जांच के लिए स्ट्रिंग पर एक फ्यूजक्शन के रूप में रेगेक्स शाब्दिक कह सकें।विस्तारित प्रकार का उपयोग करके क्लोजर के आईएफएन का विस्तार क्यों नहीं कर सकता?

मैंने नियमित क्लोजर में स्ट्रिंग्स के साथ कुछ ऐसा करने की कोशिश की, लेकिन मुझे यह अपवाद मिलता है। मुझे लगता है कि आईएफएन जावा में लिखा गया इंटरफ़ेस है लेकिन कार्यान्वयन CLojrue फ्रंट में कैसे काम करता है।

(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) 

उत्तर

6

अपवाद आप एक संकेत देना चाहिए। IFn क्लोजर में प्रोटोकॉल नहीं है। यह क्लोजरस्क्रिप्ट में है। आप extend प्रोटोकॉल, जावा इंटरफेस को लागू कर सकते हैं, और सबक्लास कक्षाएं कर सकते हैं। इस विशेष मामले में, आप java.lang.String को भी उपclass नहीं कर सकते क्योंकि इसे अंतिम घोषित किया गया है।

+1

इस मामले में मेरी सबसे अच्छी शर्त एक नया प्रकार होगा जो सिर्फ java.lang.String को लपेटता है और इसे छोड़कर सभी कॉल को पास करता है- Ivn Ivn को छोड़कर और लागू करता है? –

+0

लेकिन 'क्लोजर' में, कीवर्ड फ़ंक्शंस जैसे व्यवहार कर सकते हैं उदा। '(: एक {: एक 36})'। यह कैसे काम करता है? – viebel

+0

कीवर्ड जावा में लागू किए गए हैं, इसलिए वे आईएफएन इंटरफ़ेस से प्राप्त हो सकते हैं, https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Keyword.java –

संबंधित मुद्दे

 संबंधित मुद्दे