หากเป้าหมายคือการรับข้อมูลเกี่ยวกับฟังก์ชั่นและตัวแปรที่มีอยู่แล้วในสภาพแวดล้อม :
สำหรับเอกสารของฟังก์ชั่นและมาโครดูdocumentation
ฟังก์ชั่น
สำหรับตัวแปร docstrings ให้ใช้documentation-property
; ตัวอย่างเช่น:
(documentation-property
'user-init-file 'variable-documentation)
สำหรับฟังก์ชั่น arity และรายการอาร์กิวเมนต์ให้ดูคำถาม Emacs.SE นี้คำตอบและความเห็นต่อคำถาม
(ฉันพบสิ่งนี้โดยการกดC-h k C-h f
และ skimming ซอร์สโค้ดของdescribe-function
(เหมือนกันกับ docstrings ตัวแปร แต่กำลังศึกษา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
ปรากฏตัวในแบบฟอร์มระดับบนสุดคุณจะต้องลงไปในแบบฟอร์มเหล่านี้ซึ่งอาจใช้การเรียกซ้ำ
(def…)
sexps ทั้งหมดจริงๆไม่ใช่แค่สเปคระดับบนสุด? หรือการตีความระดับกลางของฟังก์ชั่นและตัวแปรที่จะกำหนดถ้าไฟล์โหลด? หรือคำจำกัดความที่ผ่อนคลายยิ่งกว่าซึ่งรวมถึงแบบฟอร์มระดับบนสุดเช่น(when nil (defun …))
)