2012-11-26 19 views
17

मैंने कई स्थानों पर पढ़ा है कि क्लोजर में सिंगल सेगमेंट नेमस्पेस को हतोत्साहित किया गया है।एकल सेगमेंट नेमस्पेस के साथ क्या गलत है?

वास्तव में मैंने देखा है कि लगभग हर लाइब्रेरी (आवश्यकता है 'lib.core) की आवश्यकता है (lib' की आवश्यकता है)।

क्यों?


संपादित करें: मैं थोड़ा बेवकूफ हूँ। एक संक्षिप्त खंड के लिए अतिरिक्त क्रेडिट दिया जाएगा कि एक सेगमेंट नेमस्पेस एक बुरी चीज कैसे हो सकती है।

उत्तर

14

जावा डिफ़ॉल्ट पैकेज के उपयोग को हतोत्साहित करता है क्योंकि आप किसी अन्य पैकेज से इसमें कुछ भी संदर्भित नहीं कर सकते हैं। यदि आप एक सेगमेंट क्लोजर नेमस्पेस को पूर्व-संकलित करते हैं, तो आपको डिफ़ॉल्ट पैकेज में जावा क्लास मिल जाएगा। यदि कोई भी जावा से आपकी लाइब्रेरी का उपयोग करना चाहता है, तो वह इस छोटी सी चीज से मर जाएगा। चूंकि एकल-सेगमेंट नेमस्पेस का उपयोग करने के पक्ष में कोई अच्छा कारण नहीं है, और यह एक अच्छी तरह से परिभाषित कारण नहीं है, यह कहना उचित है कि एकल-सेगमेंट नामस्थान क्लोजर में एक निराश अभ्यास होना चाहिए।

+0

ठीक है, तो doom.clj -> doom.class लेकिन (ns horror.doom) डरावनी/doom.clj में पैकेज डरावनी में doom.class पर जाता है? और मुझे (ns horror.doom) का उपयोग करने के लिए उपनिर्देशिका डरावनी होना है? –

+2

हां, यह वह सम्मेलन है जिसके द्वारा क्लोजर नामस्थान पर आधारित .clj फ़ाइलों को स्वचालित रूप से ढूंढता है। –

6

सिंगल सेगमेंट नेमस्पेस में जावा इंटरऑप के साथ समस्याएं हैं। अप्रत्याशित तरीकों से कुछ चीजें तोड़ सकती हैं। यह भी देखें https://groups.google.com/forum/?fromgroups=#!topic/clojure/gOffhotk25Y

+0

मैंने इसे पढ़ा और मुझे अभी भी यकीन नहीं है कि क्या हो रहा है। सबसे अच्छा मैं इसका अनुवाद कर सकता हूं 'क्लोजर में घुसपैठ करने वाला कुछ प्रतिकूल जावा-गर्भपात है लेकिन यह स्पष्ट नहीं है कि यह वास्तव में बुरा कैसे हो सकता है।' फिर भी धन्यवाद। –

+2

JVM पर क्लोजर में, '(ns foo.bar) '* * * * में * कक्षा * बार में परिणाम, बार में आंतरिक कक्षाओं के रूप में परिभाषित कार्यों के साथ। इसका अर्थ है क्लोजर में "टूपलवेल" नेमस्पेस वास्तव में "पैकेज-कम" वर्ग हैं, जिन्हें विशेष रूप से (कुछ संभावित रूप से अप्रत्याशित तरीकों से) JVM और/या जावा द्वारा नियंत्रित किया जाता है। –