Якщо мета - отримати інформацію про функції та змінні, які вже знаходяться в оточенні :
Документи про функції та макроси див. У documentation
функції.
Для змінних доктринів використовуйте 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
надходять у форми верхнього рівня, потрібно було б перейти до цих форм, можливо, використовуючи рекурсію.
(def…)
сексопи, а не лише специфікації найвищого рівня? Або проміжна інтерпретація функцій та змінних, які були б визначені, якщо файл завантажений? Або більш спокійне визначення, яке включає такі форми вищого рівня, як(when nil (defun …))
)?