जब Emacs#फ़ंक्शन सिंटैक्स का उपयोग किया जाना चाहिए?




lisp elisp (3)

असल में, मैं एमैक्स लिस्प की function प्रक्रिया का उपयोग कब करना चाहिए? मुझे कोई ऐसे उदाहरण नहीं मिले हैं जिसमें व्यवहार में कोई फर्क नहीं पड़ता है यदि आप फ़ंक्शन के तर्कों 'like-this या #'like-this वास्तव में, अगर मैं मूल्यांकन करता हूँ (eq 'goto-char #'goto-char) यह रिटर्न देता t

एमैक्स लिस्प कोड जिसे मैंने देखा है शायद ही कभी function का उपयोग करता function / #' ; लेखकों बस quote / ' सब कुछ
उदाहरण: (add-hook 'emacs-lisp-hook 'turn-on-eldoc-mode)

हालांकि, मैं कुछ गिनती के नमूने मिल सकता है। इमैक 24.3 के electric.el के स्रोत कोड से यह एक है:

(add-hook 'post-self-insert-hook
          #'electric-indent-post-self-insert-function
          'append)

अनुमान और आगे प्रश्न:

  • क्या यह सिर्फ एक लिस्प-2 शैलीगत सम्मेलन है?
  • क्या यह बाइट-संकलन के साथ करना है?
  • क्या यह पुस्तकालय लेखकों के लिए ही बात करता है? जैसे, यदि आप चाहते हैं कि आपका कोड बहुत बड़ा वातावरण और एएमएसीएस संस्करणों के तहत चलाया जाए? (यदि आप बस "डॉटफ़ाइल-टिंकरिंग" हो तो परिणाम होगा यदि आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।)
  • मुझे लैम्ब्डा-अभिव्यक्ति कहां चाहिए? जब मैं उन्हें छोड़ नहीं सकता
    उदाहरण, (do-something '(lambda …
    बनाम (do-something (lambda …
  • क्या ईएमएसीएस के एक पुराने संस्करण में कुछ सीमाएं थीं जो एलिसपी के इन पहलुओं को जन्म देती हैं? जैसे, क्या मैं ज्यादातर ' और #' बीच के अंतर को तब तक अनदेखा कर सकता हूं जब तक कि मैं एक्स की तुलना में एमएसीएक्स के संस्करण का उपयोग कर रहा हूं?

(lambda ...) उद्धरण के दौरान मतभेदों के अलावा हाल ही में (एमएसीएस 24.4 के रूप में), बीटेकंप.पी. में एक बदलाव किया गया है, जैसे कि #'symbol प्रपत्र का उपयोग किया जाता है, लेकिन फ़ंक्शन नहीं है। संकलन के अंत में परिभाषित करने के लिए जाना जाता है।

फ़ंक्शन-कोटिंग के साथ सभी फ़ंक्शन प्रतीकों को लिखना #'symbol सिंटैक्स की बजाय 'symbol सिंटैक्स इस प्रकार कुछ हद तक बेहतर है, क्योंकि यह बाइट-कंपाइलर को यह जांचने की अनुमति देता है कि क्या आपने फंक्शन नामों का उपयोग किया है जो वास्तव में परिभाषित किए गए हैं

पहले (एमएसीएस 24.3 और पूर्व), जबकि बाइट-कंपाइलर चेतावनी देगा जब आप फ़ंक्शन को कॉल करेंगे (no-such-function ...) (mapcar #'no-such-function ...) (no-such-function ...) और इसे परिभाषित नहीं किया जाता है या किसी अन्य फ़ाइल से साफ रूप से आयात नहीं किया जाता है, जैसे कुछ (mapcar #'no-such-function ...) एक संकलन-समय चेतावनी के बिना केवल एक रनटाइम-त्रुटि का निर्माण किया होता

परिवर्तन का मतलब है कि इन दोनों स्थितियों में अब संकलन-समय चेतावनियां उत्पन्न होती हैं; हालांकि यदि आप फ़ंक्शन-कोटेशन का उपयोग किए बिना (mapcar 'no-such-function ...) का प्रयोग करते हैं, तो एक बार फिर, कोई संकलित समय की चेतावनी उत्पन्न नहीं की जा सकती। तो #' त्रुटियों को ढूँढ़ने में मदद कर सकता है (शायद टाइपो) जल्दी

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


एलिस्ट #' है (प्रभाव में) विशुद्ध रूप से बाइट-संकलन के बारे में ( संपादित करें: और बाद में एमएसीएएस 24, भी शाब्दिक बंद ); लेकिन आपको शायद इसके उपयोग की भी आवश्यकता नहीं होगी।

#'... थोड़े हाथ के लिए है (function ...) जो '... / (quote ...) का एक प्रकार है जो कि बाइट-कंपाइलर को भी संकेत देता है कि वह उद्धृत फ़ॉर्म को संकलित कर सकता है समारोह।

हालांकि, आधुनिक एमएसीएस (आईआईआरसी में यह हमेशा मामला नहीं था), (lambda ...) #'(lambda ...) बराबर है, इसलिए मेरा मानना ​​है कि आप शायद ही कभी (यदि कभी) को #' लिखने की आवश्यकता होगी #'

आप भी शायद ही कभी '(lambda ...) का उपयोग करना चाहते हैं, क्योंकि स्टीफन ने विस्तार से बताया है (लेकिन 'symbol ठीक है)।

यह मैन्युअल में (elisp) Anonymous Functions आरईटी के तहत कवर किया गया है (यद्यपि उदाहरण कोड के अंतिम भाग में कोई त्रुटि प्रतीत होती है, क्योंकि यह पिछले उदाहरण के समान है (इमाक्स 24.3.1 में))।

(एनबी स्टीफन का जवाब निश्चित है, लेकिन मैं इसे यहाँ रखूँगा क्योंकि उम्मीद है कि इसे पूरक होगा।)


function (उर्फ #' ) का उपयोग कार्यों को उद्धृत करने के लिए किया जाता है, जबकि quote (उर्फ ' ) का उपयोग डेटा उद्धृत करने के लिए किया जाता है। अब, एमएक्स-लिस्प में एक प्रतीक जिसका फ़ंक्शन सेल फ़ंक्शन होता है, वह फ़ंक्शन होता है, इसलिए #'symbol केवल वही 'symbol प्रथा में होता है (यद्यपि इरादा अलग होता है, पहले यह स्पष्ट करता है कि कोई सिर्फ बात नहीं कर रहा है प्रतीक "प्रतीक" के बारे में, लेकिन "प्रतीक" नामक फ़ंक्शन के बारे में)

वह स्थान जहां अंतर केवल लैंगिकता का नहीं है, जब वह लम्ब्दास का हवाला देते हैं: '(lambda ...) एक ऐसी अभिव्यक्ति है जो एक सूची का मूल्यांकन करता है जिसका पहला तत्व प्रतीक lambda । आपको car और cdr जैसी चीजों को लागू करने की अनुमति है, लेकिन आपको इसे कॉल नहीं करना चाहिए जैसा कि यह एक फ़ंक्शन था (हालांकि व्यवहार में यह सिर्फ ठीक काम करता है)। इसके विपरीत #'(lambda ...) (जो लिखा जा सकता है (lambda ...) ) एक अभिव्यक्ति है जो किसी फ़ंक्शन के मूल्यांकन करता है । इसका अर्थ है कि आप इसे car पर लागू नहीं कर सकते हैं, लेकिन बाइट-कंपाइलर #'(lambda ...) अंदर देख सकते हैं, इसमें मैक्रो विस्तार कर सकते हैं, आपको चेतावनी देते हैं कि क्या मिलेगा, कोषेर नहीं दिखता है आदि। ।; लिनक्स-बाध्यकारी के लिए इसे मुक्त चर को खोजने के लिए अंदर भी देखना पड़ता है, जिसमें उस फ़ंक्शन को संदर्भ मिलता है।





elisp