क्या लैम्बडा के लिए उत्पन्न डॉक्टर स्ट्रिंग संलग्न करना संभव है?


10

Emacs डॉक्स का कहना है कि जब डॉक्टर स्ट्रिंग को अंदर रखा जाता है lambdaया defunयह "सीधे फ़ंक्शन ऑब्जेक्ट में संग्रहीत होता है"। हालाँकि, हम इस तरह नामित कार्यों के डॉक्स बदल सकते हैं:

(put 'my-function-name 'function-documentation "Blah.")

लेकिन यही ट्रिक लैम्ब्डा के साथ काम नहीं करती है। क्या लैम्ब्डा में प्रलेखन जोड़ने का एक तरीका है? या किसी तरह गतिशील रूप से डॉक्टर-स्ट्रिंग शाब्दिक उत्पन्न करते हैं?

स्पष्ट करने के लिए, निम्नलिखित स्थिति की कल्पना करें:

(let ((foo 1)
      (bar 2))
  (lambda ()
    (+ foo bar)))

मैं चाहता हूं कि लंबोदर के पास एक डॉक स्ट्रिंग हो, जिसमें fooऔर मूल्यों का उल्लेख हो bar

जवाबों:


12

अच्छी तरह से लंबोदर किसी भी अन्य कार्य की परिभाषा की तरह ही नियमित रूप से कर सकते हैं:

(lambda ()
   "I'm a docstring!"
   (+ foo bar))

तो आप उपयोग कर सकते हैं:

(let ((foo 1)
      (bar 2))
  `(lambda ()
     ,(format "Function which sums foo=%s and bar=%s" foo bar)
     (+ foo bar)))

आप एक अनाम फ़ंक्शन पर एक डॉकस्ट्रिंग क्यों चाहते हैं, यह एक और सवाल है, जो आपके द्वारा लिए गए दृष्टिकोण को प्रभावित कर सकता है।

उदाहरण के लिए, यदि आप इसे किसी कुंजी से बांधने की योजना बना रहे हैं और आप C-h kउस सहायता को प्रदर्शित करना चाहते हैं, तो आप इस दृष्टिकोण का उपयोग कर सकते हैं, लेकिन निश्चित रूप से मदद अभी भी फ़ंक्शन ऑब्जेक्ट को ही प्रदर्शित करेगी (इसमें शामिल है), जो ऐसा नहीं है महान; फिर भी आप ऐसा कर सकता है और आप चाहते हैं (यह भी) अच्छी तरह से स्वरूपित संस्करण देखें:

(global-set-key
 (kbd "C-c a")
 (let ((foo 1)
       (bar 2))
   `(lambda ()
      ,(format "Function which sums foo=%s and bar=%s" foo bar)
      (interactive)
      (+ foo bar))))

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

(global-set-key
 (kbd "C-c a")
 (let ((foo 1)
       (bar 2))
   (defalias (make-symbol "a-foo-bar-function")
     (lambda ()
       (interactive)
       (+ foo bar))
     (format "Function which sums foo=%s and bar=%s" foo bar))))

या (और यह बहुत ही एक ही बात है) आप बिना अंक के प्रतीक पर कब्जा कर सकते हैं, और सीधे अपने मूल कोड के अनुसार प्रतीक संपत्ति सेट कर सकते हैं:

(global-set-key
 (kbd "C-c a")
 (let ((foo 1)
       (bar 2)
       (sym (make-symbol "a-foo-bar-function")))
   (put sym 'function-documentation
        (format "Function which sums foo=%s and bar=%s" foo bar))
   (defalias sym
     (lambda ()
       (interactive)
       (+ foo bar)))))

एक साइड नोट के रूप में, ध्यान रखें कि यह फ़ंक्शन केवल आपके लाइब्रेरी के लिए fooऔर barयदि आप उपयोग कर रहे हैं, तो लेट-बाउंड मानों को समेटने जा रहे हैं lexical-binding: t। यदि फू और बार गतिशील रूप से बंधे होते हैं, तो मैंने जो डॉकस्ट्रिंग्स उत्पन्न किए हैं, वे संभवतः रन-टाइम पर सटीक नहीं होंगे। हम वास्तव में गतिशील docstrings के साथ उस स्थिति को पूरा कर सकते हैं , हालांकि। जानकारी नोड का (elisp) Accessing Documentationकहना है documentation-property:

यदि संपत्ति का मूल्य 'शून्य' नहीं है, तो एक स्ट्रिंग नहीं है, और किसी फ़ाइल में पाठ का संदर्भ नहीं देता है, तो यह स्ट्रिंग प्राप्त करने के लिए लिस्प अभिव्यक्ति के रूप में मूल्यांकन किया जाता है।

इसलिए किसी भी प्रतीक-आधारित दृष्टिकोण के साथ, हम प्रलेखन फॉर्म को उद्धृत कर सकते हैं ताकि कॉल समय पर इसका मूल्यांकन किया जा सके:

(defalias (make-symbol "a-foo-bar-function")
   (lambda ()
     (interactive)
     (+ foo bar))
   '(format "Function which sums foo=%s and bar=%s" foo bar))

13

Emacs-25 में, इस उद्देश्य के लिए एक नई विशेषता है:

(let ((foo 1)
      (bar 2))
  (lambda ()
    (:documentation (format "Return the sum of %d and %d." foo bar))
    (+ foo bar)))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.