क्यों नहीं है अपरिहार्य नामस्थान?


40

क्यू: elisp में नाम स्थान क्यों नहीं है, और हम उन्हें कैसे प्राप्त कर सकते हैं?

Elisp में वैश्विक एक के अलावा अन्य नाम स्थान नहीं हैं, जिसके कारण सभी वैश्विक कार्यों, चर, और स्थिरांक को एक अद्वितीय उपसर्ग के साथ कोडित करने की परंपरा है।

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

मैं यह देखने के लिए इधर-उधर घूमता रहा कि क्या मुझे पता चल सकता है कि कुछ दशकों के उपयोग के बाद भी एलिस्प नाम की जगह क्यों नहीं है, लेकिन मामूली फसल पर थोड़ा आश्चर्यचकित था। नामस्थान पर विकि पृष्ठ काफी कम है। निक फेरियर के पास इस मुद्दे का एक लंबा इलाज है, और इस पर emacs-devel पर काफी हालिया धागा है । 2010 से एक पुराना स्टैक ओवरफ्लो धागा है जो नाम स्थान को लागू करने के लिए मैक्रोज़ का उपयोग करने की संभावना पर चर्चा करता है; मैक्रो दृष्टिकोण का एक और उदाहरण यहां पाया जा सकता है । कम से कम कुछ कार्यान्वयन ( यहां और यहां , बाद के विवरण के साथ) यहां हैं) वहाँ से बाहर है, लेकिन वे कुछ वर्षों के लिए बहुत गतिविधि नहीं देखी है, और मैं किसी भी पुस्तकालयों में नहीं है जो उनका उपयोग करते हैं।

मुझे लगता है कि, अगर नामस्थान जोड़ना आसान था, तो यह पहले से ही किया जाएगा। इसलिए:

  • नाम स्थान को अनिवार्य रूप से जोड़ने के लिए तकनीकी बाधाएं क्या हैं?
  • क्या नामस्थान जोड़ने से मौजूदा कोड बहुत टूट जाएगा?
  • क्या यह कार्यशीलता कुछ ऐसी है जिसे जैविक रूप से स्वयं को बदलना है (दुभाषिया में परिवर्तन), या इसे वास्तव में मैक्रोज़ के शीर्ष पर बनाया जा सकता है?

6
आप इस पर एक नज़र डाल सकते हैं: github.com/Bruce-Connor/names यह स्वचालित नामस्थानों के कार्यान्वयन के लिए एक बैकवर्ड-संगत (नामों को अलग करने के वर्तमान मैनुअल तरीके के साथ) प्रतीत होता है। (और मुझे यकीन है कि 99% मैंने एक और ऐसी लाइब्रेरी देखी है, जिससे डेवलपर को नाम स्थान के साथ फ़ंक्शन का सबसेट निर्यात करने की अनुमति मिलती है, हाल ही में कुछ ईमैक्स ब्लॉग पर उल्लेख किया गया है, लेकिन मैं इसे वापस नहीं पा सका)।
टी। वेरॉन

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

1
मुझे लगता है कि नामस्थानों का मतलब अलग-अलग चीजें हैं। मैंने कहा है कि emacs के कई नामस्थान होंगे: एक वैरिएबल के लिए, दूसरा फ़ंक्शंस और मैक्रोज़ के लिए, दूसरा
फ़ेस के

1
@ हैराल्डचेच-ऑलसेन आप निश्चित रूप से ऐसा कह सकते हैं। उस संदर्भ में वह पूछ रहा है कि प्रति पैकेज नेमस्पेस क्यों नहीं हैं।
मालाबार

जवाबों:


28

कोई नामस्थान क्यों नहीं?

क्योंकि यह जटिल है, और किसी ने भी अभी तक पूर्ण डुबकी लेने के लिए पर्याप्त रूप से जरूरी नहीं माना है। यह पहले (एक से अधिक बार) देव सूची में चर्चा की गई है, और इसे हटाने के कदम के बाद इसे ठीक करने के वादे किए गए हैं।

इस बीच, मैंने अपना खुद का एक समाधान लिखा (विकल्पों की सूची के लिए नीचे देखें)।

तकनीकी बाधाएं क्या हैं?

दरवाजे के ठीक बाहर आपके पास 3 बड़ी बाधाएँ हैं, जिन्हें आपको पार करने की आवश्यकता है ताकि नाम स्थान भी एक वर्तमान ईवा पर काम करने का मौका हो:

  • आपको यह बदलने की आवश्यकता है कि प्रतीकों को कैसे इंटर्न किया जाता है (यह आसान हिस्सा है)।
  • बाइट-कंपाइलर को नामस्थान समझने की जरूरत है।
  • ऑटोलैड पीढ़ी द्वारा उपयोग किए package.elजाने वाले नामस्थानों को समझने की आवश्यकता है।

हालांकि नामस्थानों को लागू करने के लिए इन 3 चीजों को काम करना आपके लिए मामूली नहीं है। यदि आप केवल सबसे हाल के Emacs संस्करण के लिए समर्पित हैं, तो यह निश्चित रूप से उल्लेखनीय है। यदि आप किसी प्रकार का पैकेज लिखना चाहते हैं, जो पिछले संस्करणों (जैसे पूरे 24 परिवार) का समर्थन करता है, तो यह एक चुनौती के एक नरक में बदल जाता है।

इसके अलावा, अन्य वैकल्पिक बाधाओं के टन हैं। आपके लिए उपलब्ध साधनों में सभी शक्ति होने के कारण एलिफ़िश बढ़िया है और इन सभी को नाम स्थान के साथ काम करने के लिए पैच करना होगा। सबसे महत्वपूर्ण हैं:

  • edebug
  • eval-defun
  • eval-अंतिम sexp
  • कीचड़

क्या यह बहुत सारे मौजूदा कोड को तोड़ देगा?

नहीं अगर आप इसे सही करते हैं।

क्या यह कुछ ऐसा है जिसे जैविक होने की आवश्यकता है, या क्या यह वास्तव में मैक्रोज़ के माध्यम से शीर्ष पर बनाया जा सकता है?

आदर्श रूप से यह जैविक होगा, कि देव सूची में आने पर आमतौर पर चर्चा की जाती है। लेकिन शीर्ष पर बनाए जाने के दौरान इसे काफी अच्छा बनाया जा सकता है ।
इसके कुछ उदाहरण इस सूची से लिए गए हैं :


1
धन्यवाद - इस मुद्दे पर एक बहुत जानकारीपूर्ण जानकारी थी। मैं आपके अंतिम बिंदु के बारे में उत्सुक हूं: आपका namesसमाधान। मुझे आश्चर्य है कि वहाँ संदेह है कि एक कार्बनिक, निर्मित समाधान नहीं के लिए भी दूर भविष्य में आ रहा है, या अगर हम सिर्फ अंतर्निहित अपनाना चाहिए किसी भी कारण से अगर पर समाधान आपके द्वारा दिए गए।
दान

1
@ हाँ, वहाँ है। । उस ने कहा, इस बीच नाम नहीं अपनाने का कोई कारण नहीं है । यह Emacs के सम्मेलनों के साथ पूरी तरह से संगत है, इसलिए किसी भी समय Names का उपयोग करने से रोकने के लिए कोई भी पैकेज Names का उपयोग करने के लिए स्वतंत्र है , और उपयोगकर्ता को कोई बात नहीं पता होगी।
मालाबार

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

22

पिछली बार इस पर emacs-devel पर चर्चा हुई थी, चर्चा तब रुकी जब लार्स जैसे लोगों ने बताया कि वे M-x grepकिसी चीज़ के लिए सक्षम होना पसंद करते हैं। Elisp में नामस्थान जोड़ना बहुत कठिन नहीं होना चाहिए, लेकिन उन्हें सही तरीके से संभालने के लिए सभी परिचित उपकरण प्राप्त करना एक और मुद्दा है।


मुझे लगता है कि सबसे अधिक इस्तेमाल किए जाने वाले सामान्य कार्यों (या उन सभी, शायद) के लिए उपनाम बनाकर आसानी से 'निश्चित' किया जा सकता है
जेसी

1
"Grep" की आवश्यकता आमतौर पर एक पैकेज को विकसित करते समय दिखाई देती है, जिसमें से आपको यह जानना होगा कि एक चर / फ़ंक्शन का उपयोग अन्य पैकेजों में कहाँ किया जा सकता है, इसलिए यह केवल विशिष्ट महत्वपूर्ण लोगों के बजाय किसी भी मनमाना चर / फ़ंक्शन पर लागू हो सकता है। इस कारण से, कुछ उपनाम जोड़ने से कोई फर्क नहीं पड़ेगा। एक और कारण है कि माइट मदद नहीं करेगा, यह है कि एक उपनाम जोड़ने से आपको उन उपयोगों को खोजने में मदद नहीं मिलेगी जो इस उपनाम का उपयोग नहीं करते हैं।
स्टीफन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.