2015-11-22 7 views
15

क्लोजर में declare मैक्रो है जो आपको फ़ंक्शंस या चर को अग्रेषित करने की अनुमति देता है। यह def के रूप में वास्तव में कार्य करने के लिए लगता है: दोनों (declare x) और (def x)#<Unbound Unbound: #'user/x>आगे की घोषणा के लिए `def` बनाम 'घोषणा'

बनाने (declare x)(def x) के स्थान पर किया कब करना चाहिए?

उत्तर

17

दोनों declare और def एक अबाध वर बना सकता हूँ, लेकिन वहाँ declare का उपयोग करने के 3 लाभ हैं:

  1. आप एक बयान करता है, उदा में एक से अधिक वार्स बना सकते हैं (declare x y z)
  2. वार्स अतिरिक्त मेटाडेटा {:declared true}
  3. शब्द declare का उपयोग के साथ टैग कर रहे हैं यकीनन अधिक स्पष्ट और मुहावरेदार है

(source declare):

(defmacro declare 
    "defs the supplied var names with no bindings, useful for making forward declarations." 
    {:added "1.0"} 
    [& names] `(do [email protected](map #(list 'def (vary-meta % assoc :declared true)) names))) 
3

प्रलेखन जवाब देता है:

=> (doc declare) 
------------------------- 
clojure.core/declare 
([& names]) 
Macro 
    defs the supplied var names with no bindings, useful for making forward declarations. 

Looking at the implementation, यह स्पष्ट है कि declaredef के संदर्भ में परिभाषित किया गया है और सिंटैक्स चीनी का एक छोटा सा प्रदान करता है। तो कार्यात्मक रूप से, वे काफी समान हैं।

declare का लाभ बाद के पाठक के लिए इरादा दिखाना है। (declare x y z) मैं उन प्रतीकों में से एक आगे घोषणा बनाने के लिए, क्योंकि मैक्रो useful for making forward declarations.

(def x) (def y) (def z) का मतलब है मैं इन प्रतीकों होना शामिल कर रहा हूँ है इरादा मतलब है, लेकिन आप अगर मैं उन्हें परिभाषाओं प्रदान करने के उद्देश्य से जानते हैं और करने के लिए या कि क्या मैं भूल नहीं है मैं आगे की घोषणा कर रहा हूं, या शायद कुछ और सूक्ष्म।

तो, को (def x) पर प्राथमिकता दी जानी चाहिए, जब आप आगे की घोषणा कर रहे हैं, तो अपने कोड के भविष्य के पाठकों पर दया दिखाने के लिए।

1

def हमेशा रूट बाइंडिंग पर लागू होता है, भले ही var उस बिंदु पर थ्रेड-बाध्य है जहां def कहा जाता है।

def स्वयं को उत्पन्न करता है (इसका मूल्य नहीं)। यदि प्रतीक पहले ही नामस्थान में है और एक इंटर्न वाले var में मैप नहीं किया गया है तो अपवाद फेंकता है।

def घोषित किए गए विभिन्न नामों को बिना किसी बाध्यकारी के घोषित करें, जो आगे की घोषणाओं के लिए उपयोगी हैं।

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