तेज उद्धरणों का उपयोग कब किया जाना चाहिए?


10

मैं अन्य लोगों के eLisp कोड में उपयोग किए जा रहे तीखे उद्धरणों को देखता हूं, और मैं उन्हें स्वयं उपयोग करता हूं, लेकिन मैं पूरी तरह से स्पष्ट नहीं हूं कि वे कब उपयुक्त हैं और कब नहीं।

क्या कोई इस पर स्पष्ट कर सकता है कि कब तीखे उद्धरणों का उपयोग करना उचित है और जब साधारण एकल उद्धरणों का उपयोग किया जाना चाहिए?


3
nb यहाँ इस सवाल के लिए कई डुप्लिकेट हैं या SO
phils


1
मुझे नहीं लगता कि यह एक डुप्लिकेट है: emacs.stackexchange.com/questions/3595#' लैम्ब्डा के साथ उपयोग करने के बारे में है (जहां उत्तर मूल रूप से "कभी नहीं" है), जबकि @ izkon का प्रश्न #'प्रतीकों पर लागू होने के बजाय लागू होता है ।
स्टीफन

जवाबों:


12

#'बस के लिए आशुलिपि है function, बस के 'लिए आशुलिपि है quote

आप इसे कहीं भी उपयोग कर सकते हैं जहां आप बाइट-कंपाइलर या दुभाषिया या एक मानव पाठक को इंगित करना चाहते हैं कि इसका तर्क एक फ़ंक्शन होने की उम्मीद है (माना जाता है)।

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

लेकिन कभी-कभी कोड स्पष्ट होता है यदि आप #'ऐसे संदर्भों में उपयोग करते हैं । भले ही Emacs-Lisp यह समझता हो कि प्रतीक का उपयोग ऐसे संदर्भों में एक फ़ंक्शन के रूप में किया जाता है, यह कोड के एक मानव पाठक के लिए इस पर जोर देने में मदद कर सकता है।

कुछ अन्य लिस्प्स में, लैम्ब्डा रूपों का उपचार जो केवल उद्धृत किया जाता है (के साथ ') या अनक्वॉटेड होते हैं, उनके उपयोग से फ़ंक्शन स्थिति में उनके उपयोग से भिन्न हो सकते हैं function( #')। लेकिन Emacs Lisp में नहीं। Emacs Lisp में आपको ( 'या तो #') या एक लैम्ब्डा फॉर्म को उद्धृत करने की आवश्यकता नहीं है जिसे आप एक फ़ंक्शन के रूप में इलाज करना चाहते हैं (और केवल एक सूची के रूप में नहीं)। यदि आप चाहते हैं कि इसे केवल एक सूची के रूप में संभाला जाए, कार lambdaआदि के साथ , तो इसे उद्धृत करें (साथ ') - नीचे दिए गए उदाहरण से यह पता चलता है।

(Elisp) बेनामी कार्यों से :

- विशेष प्रपत्र: function function-object

यह विशेष रूप इसका FUNCTION-OBJECTमूल्यांकन किए बिना लौटता है।

इस में, यह quote(नोट नोटिंग: :) के समान है । लेकिन इसके विपरीत quote, यह Emacs मूल्यांकनकर्ता और बाइट-कंपाइलर के लिए एक नोट के रूप में भी कार्य करता FUNCTION-OBJECTहै, जिसका उपयोग फ़ंक्शन के रूप में करने का इरादा है। मान FUNCTION-OBJECTलेना एक मान्य लंबोदर अभिव्यक्ति है, इसके दो प्रभाव हैं:

• जब कोड को बाइट-संकलित FUNCTION-OBJECTकिया जाता है, तो एक बाइट-कोड फ़ंक्शन ऑब्जेक्ट (* नोट बाइट संकलन: :) में संकलित किया जाता है।

• जब लेक्सिकल बाइंडिंग को सक्षम किया जाता है, तो FUNCTION-OBJECTइसे क्लोजर में बदल दिया जाता है। * नोट क्लोजर ::।

रीड सिंटैक्स #'का उपयोग करने के लिए एक छोटा हाथ है function। निम्नलिखित प्रपत्र सभी समतुल्य हैं:

(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))

निम्नलिखित उदाहरण में, हम एक change-propertyफ़ंक्शन को परिभाषित करते हैं जो एक फ़ंक्शन को उसके तीसरे तर्क के रूप में लेता है, उसके बाद एक double-property फ़ंक्शन होता है जो change-propertyइसे एक अनाम फ़ंक्शन से गुजरने से उपयोग करता है:

(defun change-property (symbol prop function)
   (let ((value (get symbol prop)))
     (put symbol prop (funcall function value))))

(defun double-property (symbol prop)
   (change-property symbol prop (lambda (x) (* 2 x))))

ध्यान दें कि हम lambdaफ़ॉर्म को उद्धृत नहीं करते हैं ।

यदि आप उपरोक्त कोड संकलित करते हैं, तो अनाम फ़ंक्शन भी संकलित किया जाता है। ऐसा नहीं होगा, कहते हैं, आपने एक सूची के रूप में उद्धृत करके अनाम फ़ंक्शन का निर्माण किया था:

(defun double-property (symbol prop)
   (change-property symbol prop '(lambda (x) (* 2 x))))

उस मामले में, अनाम फ़ंक्शन को संकलित कोड में लंबोदर अभिव्यक्ति के रूप में रखा जाता है। बाइट-कंपाइलर यह नहीं मान सकता है कि यह सूची एक फ़ंक्शन है, भले ही यह एक जैसा दिखता है, क्योंकि यह नहीं जानता कि change-propertyयह एक फ़ंक्शन के रूप में उपयोग करने का इरादा रखता है।


9

#'(उर्फ function) के सामने इस्तेमाल किया जा सकता है, (lambda ...)लेकिन यह वहां बेमानी है, इसलिए एकमात्र ऐसा स्थान है जहां यह वास्तव में सार्थक है, प्रतीक के सामने #'car। ELisp में, #'carऔर 'carलगभग पूरी तरह से समतुल्य हैं, इसलिए मुख्य उद्देश्य में से एक उद्देश्य का दस्तावेजीकरण करना है (यानी यह इंगित करने के लिए कि जो कोई भी इस कोड को पढ़ता है जिसे आप एक फ़ंक्शन के रूप में इस प्रतीक का उपयोग करने का इरादा रखते हैं)। फिर भी कुछ परिस्थितियाँ हैं, जहाँ अंतर अधिक महत्वपूर्ण है:

  • बाइट-कंपाइलर इस प्रलेखित इरादे का लाभ उठाता है और जब आप लिखते हैं #'carतो यह जांच करेगा कि क्या यह carएक फ़ंक्शन के रूप में मौजूद है, और यदि यह नहीं मिलता है, तो यह एक चेतावनी का उत्सर्जन करेगा, जैसे कि यदि आप उस फ़ंक्शन को कॉल करते हैं ।
  • अंदर cl-fletऔर cl-labelsकेवल, केवल #'fस्थानीय रूप से परिभाषित फ़ंक्शन को संदर्भित कर सकते हैं f, क्योंकि 'fअभी भी वैश्विक प्रतीक f(और जो भी फ़ंक्शन इसके symbol-functionस्लॉट में संग्रहीत किया जा सकता है ) को संदर्भित करेगा । उदाहरण के लिए

    (cl-flet ((car (x y) (+ x y)))
      (list #'car 'car))
    =>
    ((closure nil (x y) (+ x y)) car)
    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.