2011-09-26 11 views
31

मैंने क्लोजर core.clj स्रोत कोड में कुछ फ़ंक्शन पर ^:static मेटाडेटा देखा है, उदा। seq? की परिभाषा में:क्लोजर में "^: स्थिर" क्या करता है?

(def 
^{:arglists '([x]) 
    :doc "Return true if x implements ISeq" 
    :added "1.0" 
    :static true} 
seq? (fn ^:static seq? [x] (instance? clojure.lang.ISeq x))) 

क्या ठीक इस मेटाडाटा क्या करता है, और क्यों यह यह core.clj भर तो अक्सर इस्तेमाल किया?

उत्तर

34

Clojure 1.3 के विकास में रिच कार्यों के लिए क्षमता अन्य प्रकार के वापस जाने के लिए वस्तु से जोड़ना चाहते थे। यह देशी गणित ऑपरेटरों को एक समारोह में सबकुछ क्रैक किए बिना इस्तेमाल करने की अनुमति देगा।

मूल कार्यान्वयन के लिए आवश्यक कार्यों को :static चिह्नित करने के लिए समर्थित किया गया था। इस मेटा डेटा ने कंपाइलर को फ़ंक्शन में दो संस्करणों का उत्पादन करने का कारण बताया, जिसने ऑब्जेक्ट लौटाया और उस विशिष्ट प्रकार को लौटा दिया। ऐसे मामलों में जहां संकलक ने निर्धारित किया कि प्रकार हमेशा अधिक विशिष्ट संस्करण से मेल खाते हैं।

इसे बाद में पूरी तरह से स्वचालित बनाया गया था, इसलिए आपको इसे और जोड़ने की आवश्यकता नहीं है।

+1

जब आप * पूरी तरह से स्वचालित * कह रहे हैं, तो क्या आपका मतलब है कि क्लोजर कंपाइलर के हाल के संस्करणों में जुड़वां पैदा होते हैं और प्रत्येक फ़ंक्शन के लिए ऐसे अनुकूलन * निष्पादित करते हैं * कोई फर्क नहीं पड़ता^स्थिर या नहीं? –

+2

जब एनोटेशन टाइप करते हैं तो संकलक यह निर्धारित करने का कारण बनता है कि कोई फ़ंक्शन ऑब्जेक्ट के अलावा कुछ अन्य उत्पादित कर सकता है, तो अन्य रूप जेनरेट किए जाएंगे। –

-3

लगता है कि यह क्लोजर 1.3 में एक नया मेटाडेटा विशेषता है। और अगर आप 1.3 और 1.2 के बीच स्रोत की तुलना कर सकते हैं:

तो मुझे लगता है इसके साथ^करने के लिए कुछ न कुछ है: गतिशील जो इंगित करता है वर गतिशील बंधन के लिए अनुमति है या नहीं । बस मेरा अनुमान है। निश्चित नहीं है जब तक कि मैं इस विशेषता के बारे में दस्तावेज़ नहीं देखता।

8

Google समूह थ्रेड “Type hinting inconsistencies in 1.3.0”, के अनुसार यह नो-ऑप है।

^:static कुछ समय पहले एएफएआईके के लिए नो-ऑप रहा है, कुछ समय पहले बदलावों में बदलाव के बाद अनावश्यक बना दिया गया था।

- a May 2011 post चास Emerick

द्वारा
संबंधित मुद्दे