2016-01-09 13 views
6

मैं क्लोजर के लिए नया हूं, क्या आप इसका अर्थ समझ सकते हैं?न्यूबी को क्लोजर करने के लिए, अभिव्यक्ति को समझने की कोशिश कर रहे हैं

(defonce ^:dynamic *some-var1* nil) 

मैं "defonce" समझता हूं, लेकिन शेष अभिव्यक्ति नहीं। "^" क्या है? "गतिशील" क्या है? और विशेष रूप से वेरिएबल नाम में "*" क्या हैं?

उत्तर

10

defonce मैक्रो (कई अन्य लोगों की तरह) आपको कुछ तर्क के रूप में कुछ मेटाडेटा निर्दिष्ट करने की अनुमति देता है। यह मेटाडाटा अक्सर संकलक को संकेत देने के तरीके के बारे में संकेत देने के लिए प्रयोग किया जाता है।

इस मामले में, ^:dynamic मेटाडाटा कीवर्ड प्रदान किया जाता है, संकलक को यह बताते हुए कि यह प्रतीक binding form के साथ रनटाइम पर गतिशील रूप से रीबाउंड होने के लिए अनुकूलित किया जाना चाहिए।

तारांकन सिर्फ एक सम्मेलन है कि अन्य डेवलपर्स को यह पता चल जाए कि प्रतीक नियमित तरीके से बाध्य नहीं है। वे इस तथ्य पर ध्यान आकर्षित करने के लिए हैं कि यह जिस तरह से आप उम्मीद करते हैं उसमें काम नहीं कर सकते हैं।

उदाहरण के लिए, binding फ़ॉर्म थ्रेड स्थानीय है और प्रतीक केवल फ़ॉर्म के दायरे में ही रिबाउंड है।

(defonce ^:dynamic *my-var* false) 

(binding [*my-var* true] *my-var*) ;; true 

*my-var* ;; false 

बाहर से *my-var* का मूल्य का उपयोग करने का प्रयास बाध्यकारी मूल्य है कि आप उम्मीद कर रहे हैं वापस नहीं हो सकता है।

क्योंकि इस फ़ॉर्म को *special-var* सम्मेलन के साथ दर्शाया गया है, हम जानते हैं कि सामान्य व्यवहार की अपेक्षा न करें और दस्तावेज को पढ़ सकें या कहीं और प्रतीक को संदर्भित करने से पहले कोड का अध्ययन कर सकें।

+0

** हम जानते हैं कि सामान्य व्यवहार की अपेक्षा न करें और कहीं और प्रतीक का उपयोग करने से पहले कोड का अध्ययन कर सकें। ** - क्या यह एक सिफारिश है? क्या होगा यदि यह एक बंद स्रोत पुस्तकालय था? –

+0

यदि यह एक बंद स्रोत लाइब्रेरी है, तो आप दस्तावेज़ को पढ़ सकते हैं। यदि यह '* विशेष-वर्र्स *' का उपयोग कर बंद स्रोत लाइब्रेरी है और कोई दस्तावेज नहीं है, तो आपको शायद कुछ और उपयोग करने के बारे में सोचना चाहिए। –

+0

** हम जानते हैं कि सामान्य व्यवहार की अपेक्षा न करें और कहीं और प्रतीक का उपयोग करने से पहले कोड का अध्ययन कर सकें। ** - क्या यह एक सिफारिश है? –

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