Se o objetivo é obter informações sobre funções e variáveis já existentes no ambiente :
Para documentos de funções e macros, consulte a documentation
função
Para documentos variáveis, use documentation-property
; por exemplo:
(documentation-property
'user-init-file 'variable-documentation)
Para arity da função e a lista de argumentos, consulte esta pergunta do Emacs.SE , a resposta e comentários à pergunta.
(Encontrei isso pressionando C-h k C-h f
e percorrendo o código fonte de describe-function
(o mesmo para documentos de variáveis, mas estudando describe-variable
).)
Para analisar um arquivo de código-fonte do Emacs Lisp, assumindo que o objetivo é obter informações sobre os def.*
formulários de nível superior , é possível fazer algo semelhante ao seguinte.
(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)))))
Isto pode ser facilmente estendido para defvar
, defconst
, etc.
Para lidar com a defun
aparência dentro de formulários de nível superior, seria necessário descer para esses formulários, possivelmente usando recursão.
(def…)
sexps, não apenas especificações de nível superior? Ou a interpretação intermediária das funções e variáveis que seriam definidas se o arquivo for carregado? Ou uma definição mais relaxada que inclua formulários de nível superior como(when nil (defun …))
)?