एमएसीएस 24.4 में नई सलाह प्रणाली के व्यावहारिक लाभ


53

24.4 Emacs एक नई सलाह प्रणाली के साथ आता है। NEWSफ़ाइल का कहना है:

** नया पैकेज nadvice.elहल्का-वजन सलाह सुविधाएं प्रदान करता है। इसे निम्न स्तर पर रखा गया है:

*** add-function( remove-functionजिसका उपयोग किसी भी फंक्शनिंग प्लेस पर कोड को जोड़ने / हटाने के लिए किया जा सकता है, जैसे कि प्रोसेस फ़िल्टर या <foo>-functionहुक।

*** advice-add/ advice-removeजोड़ने के लिए / एक नामित समारोह के बारे में सलाह का एक टुकड़ा निकालने के लिए, बहुत पसंद defadviceकरता है।

प्रश्न: इस नए पैकेज के व्यावहारिक लाभ और निहितार्थ क्या हैं?

मैं निम्नलिखित बिंदुओं को संबोधित करने वाले उत्तरों में विशेष रूप से दिलचस्पी रखता हूं:

  • यदि मैं केवल Emacs (एड-ऑन पैकेज लिखने के विपरीत) को अनुकूलित करने के लिए सलाह का उपयोग कर रहा हूं, तो क्या मुझे नई प्रणाली पर स्विच करने की आवश्यकता है? क्या यह किसी बिंदु पर पुरानी प्रणाली को बदल देगा?

  • वास्तव में मैं उस नई प्रणाली के साथ क्या कर सकता हूं जिसे मैं पूरा नहीं कर सकता हूं defadvice?

  • "किसी भी समारोह में ले जाने वाली जगह पर कोड जोड़ने / निकालने में सक्षम" होने का क्या महत्व है?

जवाबों:


57

नई सलाह प्रणाली के निम्नलिखित फायदे हैं:

  • add-function: यह एकदम नई कार्यक्षमता है जो कि केवल मानहानि का हिस्सा नहीं था। यह के बीच संकर की तरह है add-hookऔर defadvice। भविष्य में, अधिक foo-functionचर (संशोधित के माध्यम से add-function) और कम foo-functions(संशोधित के माध्यम से add-hook) की अपेक्षा करें । यह कार्यक्षमता नई सलाह प्रणाली को लागू करने के लिए मुख्य प्रेरणा थी, जो बग रिपोर्ट द्वारा ट्रिगर की गई थी, जिसमें पूछा गया था कि विभिन्न पैकेजों के बीच प्रक्रिया-फ़िल्टर को "साझा" कैसे किया जाए।

  • कार्यान्वयन सादगी: एक बार add-functionलागू होने के बाद, यह advice-addकार्यक्षमता को लागू करने के लिए केवल 8KB लेता है जो सलाह के 100KB के सभी कार्यक्षमता को बहुत अधिक लाता है।

  • डिजाइन की सादगी: डिफैडविस में विभिन्न धारणाएं होती हैं जिन्हें आमतौर पर सटीक रूप से समझना मुश्किल होता है और / या शायद ही कभी उपयोग किया जाता है। उदाहरण के लिए "सक्षम" और "सक्रिय" सलाह के बीच का अंतर। या "पूर्व" और / या "संकलित" का अर्थ। इस से निपटने में भी सवाल हैं ad-do-it, जैसे कि यह एक कॉल के बजाय एक चर-संदर्भ जैसा दिखता है, या यह तथ्य कि आपको (setq ad-return-value ...)केवल मूल्य वापस करने के बजाय स्पष्ट रूप से आवश्यकता है ।

  • Defadvice विभिन्न समस्याओं से ग्रस्त है wrt मैक्रोएक्स्पेन्सर और संकलन: एक सलाह के शरीर को "कोड" (जिसे कंपाइलर और मैक्रोएक्सपैंडर देखते हैं) के रूप में उजागर नहीं किया जाता है, लेकिन "डेटा" के रूप में जो बाद में एक अभिव्यक्ति बनाने के लिए संयुक्त है। तो मैक्रोएक्स्पेन्शन देर से होता है (जो आश्चर्यचकित कर सकता है यदि आप चीजों का उपयोग करते हैं (eval-when-compile (require 'foo))) और लेक्सिकल-स्कूपिंग को सही ढंग से संरक्षित करना मुश्किल है।

जैसे कि क्या आपको नई प्रणाली में स्विच करने की आवश्यकता है: मैं भविष्य में किसी बिंदु पर पुरानी अवहेलना से छुटकारा पाने का इरादा रखता हूं, लेकिन मुझे लगता है कि यह भविष्य अपेक्षाकृत दूर है (और पहले इसे आगे बढ़ना होगा lisp/obsolete, फिर बाद में ग्नू ELPA को)।


1
क्या nadvice को जोड़ने के लिए योजनाएं मौजूद हैं। क्या पुरानी सलाह प्रणाली द्वारा पेश किए गए समान तर्क-संशोधन की कार्यक्षमता है?
हारून मिलर

नहीं, यह बहुत ज्यादा nadvice.el के संदर्भ में कोई मतलब नहीं रखता है जहां सलाह कार्य सामान्य पुराने सामान्य कार्य हैं। लेकिन आप एक ही प्रभाव प्राप्त करने के लिए :aroundसलाह ( :filter-argsया :filter-resultसलाह) का उपयोग कर सकते हैं ।
स्टीफन

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

@AaronMiller: कृपया इसे एक अलग एसएक्स प्रश्न बनाएं, इसलिए इसे एसएक्स टिप्पणियों की कृत्रिम सीमाओं के बिना चर्चा की जा सकती है।
स्टीफन

हो गया, emacs.stackexchange.com/q/19233/2162 पर । मैं आपके अनुसरण की सराहना करता हूं। (मैं आपके उत्तर में उल्लिखित बग रिपोर्ट को देखने के लिए उत्सुक हूं, लेकिन Google या मेल सूची सूची संग्रह खोज के माध्यम से इसे खोजने में सक्षम नहीं है। क्या आप इसे लिंक करने का मन रखते हैं?)
आरोन मिलर

9

सामान्य कार्य होने की सलाह के स्पष्ट लाभों में से एक यह है कि आप एक परिभाषा के साथ यात्रा कर सकते हैं find-function

वर्तमान में, एक (नई शैली) की सलाह दी गई फ़ंक्शन के लिए मदद को देखते समय, यह सलाह फ़ंक्शन के लिए मदद के लिए एक लिंक प्रदान करता है, और वहां से स्रोत के लिए लिंक (फ़ंक्शन की मदद के लिए हमेशा की तरह)।

पुरानी प्रणाली ने इनकॉस्टिंग इनलाइन को सलाह प्रदान की, लेकिन कोड को देखने का कोई तरीका नहीं था (मैंने आमतौर पर सहारा लिया था rgrep)।

(व्यक्तिगत रूप से मैं मदद प्रदर्शित करने के लिए पुराने और नए दृष्टिकोणों का एक मिश्रण देखना चाहता हूं, क्योंकि मुझे इनलाइन डॉकस्ट्रिंग करना पसंद है, लेकिन मुझे यकीन है कि यह ट्रैक के नीचे संभव है।)


2
हां, यह बहुत बुरा है कि नई सलाह प्रणाली आपको मौजूदा डॉक्टर स्ट्रिंग की तरह जोड़ने की अनुमति नहीं देती defadviceहै। इस Emacs बग रिपोर्ट देखें । यह कमी है।
आकर्षित किया

8

फ़ाइल हेडर से:

;;; Commentary:

;; This package lets you add behavior (which we call "piece of advice") to
;; existing functions, like the old `advice.el' package, but with much fewer
;; bells and whistles.

जैसा कि मैंने इसे पढ़ा है, प्राथमिक लक्ष्य पुरानी सलाह प्रणाली की तुलना में सरल होना है, न कि अधिक क्षमताओं का होना। डॉक्स पढ़ना, ऐसा लगता है कि advice-addइसमें उप- defadviceकार्यक्षमता add-functionशामिल है , जबकि गैर-पारंपरिक फ़ंक्शंस जैसे प्रक्रिया फ़िल्टर (जो शायद के साथ संभव था defadvice, लेकिन मुझे यकीन नहीं है कि कैसे) की सलाह देने के लिए कुछ अच्छी कार्यक्षमता है ।

जहां तक ​​मुझे पता है, defadviceआधिकारिक तौर पर पदावनत नहीं किया जाता है , इसलिए आपको इसे अभी के लिए उपयोग करने के लिए स्वतंत्र महसूस करना चाहिए (और यदि आप एक पैकेज लेखक हैं, तो आप संभवतः 24.4 तक अधिक व्यापक रूप से अपनाए जाने तक इसका उपयोग करना चाहते हैं)। हालांकि, ऐसा लगता है कि एमएसीएस लेखक अंततः पूरी तरह से नई प्रणाली में माइग्रेट करना चाहते हैं, इसलिए यह संभवतः धीरे-धीरे स्विच करने के लिए समझ में आता है।



हाँ। नया अलग है, अधिक नहीं। और हाँ, वहाँ का उपयोग बहुत है defadvice(और वहाँ जारी रहेगा)।
आकर्षित किया

0

एक बात जो मैंने यहां नहीं देखी है - हालांकि कुछ मायनों में यह "नई" सलाह प्रणाली के सरल दृष्टिकोण (बेहतर मॉड्यूलरिटी और "गोंद") के कारण है, जिसका उल्लेख अन्य उत्तरों में किया गया है - यह है: इसे जोड़ना, जोड़ना, हटाना, फिर से जोड़ना , आदि नैडविस सलाह बहुत आसान है

ऐसा अंतःक्रियात्मक रूप से, गतिशील रूप से करना संभव है, हालांकि इसे सुविधाजनक बनाने के लिए nadvice को थोड़ी मदद की आवश्यकता है। मैं इस तरह nadvice के अन्य उपयोग से अवगत नहीं हूं (सलाह की संवादात्मक रचना), लेकिन कम से कम एक ऐसा अनुप्रयोग है। मैं इसका उपयोग Isearch + में करता हूं , आपको खोज करते समय मनमाने ढंग से Isearch फ़िल्टर विधेयकों (फ़िल्टर) के संयोजनों को जोड़ने और हटाने देता है।

IOW, जिस तरह आप अपने खोज पैटर्न को लगातार बढ़ाते हैं, इसलिए आप कई फिल्टर का उपयोग करके अपनी खोज को परिष्कृत कर सकते हैं।

खोज फ़िल्टरिंग चर का उपयोग करके की जाती है isearch-filter-predicate, जो कि काफी समय से उपलब्ध है। फिर भी Isearch फिल्टरों को अक्सर परिभाषित नहीं किया जाता है। वे आम तौर पर दिए गए संदर्भ (जैसे Wdired) के लिए स्थिर और पूर्वनिर्धारित होते हैं। उपयोगकर्ताओं के लिए परिभाषित करना और उनका उपयोग करना बहुत आसान नहीं है, अंतःक्रियात्मक रूप से।

केवल एक चर है, isearch-filter-predicateइसलिए फ़िल्टरिंग को बदलने का अर्थ वास्तव में एकल फ़िल्टर को बदलना है, जो कि रचनाओं की रचना करने, विधेय को संयोजित करने, संकीर्ण करने, विस्तार करने, या अन्यथा खोज को संशोधित करने के लिए राशि है।

लेकिन यह वही है जो nadvice पर अच्छा है। संक्षेप में, nadvice फ़ंक्शंस के संयोजन के लिए इतना आसान है कि यह खोज फ़िल्टरिंग को अंतःक्रियात्मक रूप से परिष्कृत करना आसान बना सकता है । ( इसके बारे में अधिक जानने के लिए डायनामिक खोज फ़िल्टरिंग देखें ।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.