#'
बस के लिए आशुलिपि है 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
यह एक फ़ंक्शन के रूप में उपयोग करने का इरादा रखता है।