*file*
फ़ाइल संकलित जा रहा है के पथ पर सेट है, इसलिए आपके पूरे कार्यक्रम के बाद यह अब *file*
का मूल्य (eval का कोई उपयोग नहीं कल्पना करते हुए) को देखने के लिए उपयोगी है संकलित किया गया है।
आपके test.clj
उदाहरण में, println
निष्पादित किया गया है जबकि फ़ाइल अभी भी संकलित की जा रही है। यदि *file*
का संदर्भ किसी परीक्षण या फ़ंक्शन में ले जाया गया है, तो इसे *file*
के मान के बाद केवल रनटाइम पर ही संदर्भित किया जाएगा।
एक विकल्प एक मैक्रो लिखना है जो *file*
के मूल्य को विस्तारित करता है, ताकि परिणाम बाद में उपयोग किया जा सके। उदाहरण के लिए, एक फ़ाइल example.clj
हो सकता है:
(defmacro source-file []
*file*)
(defn foo [x]
(println "Foo was defined in" (source-file) "and called with" x))
आरईपीएल से
तो या कहीं भी, (foo 42)
प्रिंट होगा:
Foo was defined in /home/chouser/example.clj and called with 42
ध्यान दें कि यह कोई फर्क नहीं पड़ता जो फ़ाइल source-file
में परिभाषित किया गया है, केवल जहां इसे विस्तारित किया गया था, वह फ़ाइल है जहां foo
परिभाषित किया गया है। यह काम करता है क्योंकि यह तब होता है जब foo
संकलित किया गया है कि source-file
चलाया गया है, और source-file
का वापसी मान जो केवल एक स्ट्रिंग है, को foo
के संकलित संस्करण में शामिल किया गया है। तब स्ट्रिंग निश्चित रूप से हर बार foo
निष्पादित होती है।
यदि यह व्यवहार आश्चर्यजनक है, तो यह विचार करने में मदद कर सकता है कि *file*
के लिए रनटाइम पर प्रत्येक फ़ंक्शन के अंदर उपयोगी मूल्य होने के लिए क्या होगा। इसके मूल्य को प्रत्येक फंक्शन कॉल और रिटर्न के लिए बदलना होगा, एक दुर्लभ रूप से उपयोग की जाने वाली सुविधा के लिए एक पर्याप्त रनटाइम ओवरहेड।
ग्रेट स्पष्टीकरण; बहुत बहुत धन्यवाद! –