फ़ंक्शंस और वेरिएबल्स से डोकस्ट्रिंग्स कैसे प्राप्त करें?


11

मैं एक ऐसे फंक्शन को लिखने की कोशिश कर रहा हूं, जो मैच की किसी फाइल में किसी भी सेक्सपोसिट से डोकस्ट्रिंग्स को रिकवर करेगा (def.*)

मैं दोनों को किसी भी फ़ंक्शन / मैक्रो, साथ ही परिभाषित किए गए किसी भी चर को प्राप्त करने में सक्षम होना चाहता हूं। चरों के लिए मैं डॉकस्ट्रिंग करना चाहूंगा, जबकि किसी भी फ़ंक्शन के लिए मैं तर्क सूचियों को भी चाहूंगा।


1
स्पष्ट करने के लिए: क्या आपके पास एक एलिसा स्रोत फ़ाइल (मेरी व्याख्या) है, या क्या आपके पास मौजूदा Emacs पर्यावरण (कांस्टेंटाइन की व्याख्या) में चर और कार्यों का एक गुच्छा है? और अगर पहली व्याख्या, क्या आप वास्तव में सभी (def…)सेक्सप्स चाहते हैं , न कि केवल शीर्ष-स्तरीय चश्मा? या फ़ंक्शंस और चर की मध्यवर्ती व्याख्या जो फ़ाइल लोड होने पर परिभाषित की जाएगी? या अधिक आराम की परिभाषा जिसमें इस तरह के शीर्ष-स्तरीय रूप शामिल हैं (when nil (defun …)))?
गिल्स एसओ- बुराई को रोकना '

मैं शुरू में पहले चाहता था, हालांकि कॉन्स्टेंटाइन की व्याख्या के आधार पर मैं एक कार्यात्मक कार्यान्वयन प्राप्त करने में सक्षम था जो मुझे वह मिला जो मुझे चाहिए था। लक्ष्य, डॉकस्ट्रिंग्स के आधार पर दस्तावेज़ में मूल स्रोत को (Org में लिखा हुआ) रूपांतरित करना है।
जोनाथन लीच-पेपिन

दूसरी व्याख्या के साथ, बिल्ट-इन describe-functionऔर दोस्त जो चाहते हैं उसका काफी अच्छा हिस्सा करते हैं (डॉकस्ट्रिंग और तर्कों की सूची)।
टी। वेरॉन

जवाबों:


10

यदि लक्ष्य पर्यावरण में पहले से ही कार्यों और चर के बारे में जानकारी प्राप्त करना है :

  • फ़ंक्शंस और मैक्रोज़ के डोकस्ट्रिंग्स के लिए, फ़ंक्शन देखें documentation

  • चर docstrings के लिए, उपयोग करें documentation-property; उदाहरण के लिए:

    (documentation-property
     'user-init-file 'variable-documentation)
    
  • फ़ंक्शन एरीटी और तर्क सूची के लिए, यह Emacs.SE प्रश्न , उत्तर और प्रश्न के लिए टिप्पणियां देखें।

(मैंने C-h k C-h fइसे स्रोत कोड को दबाकर और स्किमिंग के describe-functionलिए समान रूप से पाया , लेकिन इसका अध्ययन किया गया describe-variable)।)

Emacs Lisp स्रोत कोड फ़ाइल का विश्लेषण करने के लिए, यह मानते हुए कि लक्ष्य शीर्ष-स्तरीय def.*रूपों के बारे में जानकारी प्राप्त करना है , व्यक्ति निम्नलिखित के समान कुछ कर सकता है।

(defun get-defun-info (buffer)
  "Get information about all `defun' top-level sexps in a buffer
BUFFER. Returns a list with elements of the form (symbol args docstring)."
  (with-current-buffer buffer
    (save-excursion
      (save-restriction
        (widen)
        (goto-char (point-min))
        (let (result)
          ;; keep going while reading succeeds
          (while (condition-case nil
                     (progn
                       (read (current-buffer))
                       (forward-sexp -1)
                       t)
                   (error nil))
            (let ((form (read (current-buffer))))
              (cond
               ((not (listp form))      ; if it's not a list, skip it
                nil)
               ((eq (nth 0 form) 'defun) ; if it's a defun, collect info
                (let ((sym (nth 1 form))
                      (args (nth 2 form))
                      (doc (when (stringp (nth 3 form)) (nth 3 form))))
                  (push (list sym args doc) result))))))
          result)))))

यह आसानी से करने के लिए बढ़ाया जा सकता है defvar, defconstआदि

शीर्ष-स्तरीय रूपों के अंदरdefun प्रदर्शित होने से निपटने के लिए इन रूपों में उतरना होगा , संभवतः पुनरावृत्ति का उपयोग करना।


2
पाठकों को यह जानकारी कैसे मिलेगी यह बताने के लिए +1। यही दो महत्वपूर्ण सबक है जो आपने पढ़ाया है।
ड्रू

@ ड्रू ऐसा प्रतीत होता है कि हम एक अजीब स्थिति में हैं: इस साइट का लक्ष्य खुद को अप्रचलित बनाना है ... यह चैट में एक दिलचस्प चर्चा करेगा :)
शॉन एलेड

4
@SeanAllred लोगों को सीखना सिखाना सवालों को रोकना नहीं है, यह केवल उन्हें बेहतर बनाता है।
मालाबार

3
मालाबार को +1। इस साइट का उद्देश्य होना चाहिए (IMHO) इसका उत्तर देना चाहिए जो Emacs स्वयं जवाब नहीं दे सकता है या अच्छी तरह से या आसानी से जवाब नहीं देता है । सादृश्य: साइट अंग्रेजी भाषा और उपयोग के लिए सवालों को बंद करने का एक कारण यह है कि " सामान्य रूप से उपलब्ध संदर्भों का उपयोग करके उत्तर दिए जा सकने वाले प्रश्न ऑफ़-टॉपिक *" हैं। (StackOverflow समान है।) हमें यह कहते हुए अतिवादी होने की आवश्यकता नहीं है, कि Emacs स्वयं उत्तर दे सकने वाले प्रश्न ऑफ़-टॉपिक हैं , लेकिन एक ही विचार लागू होना चाहिए: उपयोगकर्ताओं को पहले उत्तर खोजने का प्रयास करें । हमारे मामले में, इसका मतलब Emacs पूछकर है
ड्रू

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