Si el objetivo es obtener información sobre funciones y variables que ya están en el entorno :
Para las cadenas de documentos de funciones y macros, vea la documentation
función.
Para cadenas de documentos variables, use documentation-property
; por ejemplo:
(documentation-property
'user-init-file 'variable-documentation)
Para la función arity y la lista de argumentos, vea esta pregunta de Emacs.SE , la respuesta y los comentarios a la pregunta.
(Encontré esto presionando C-h k C-h f
y deslizando el código fuente de describe-function
(lo mismo para cadenas de documentos variables, pero estudiando describe-variable
)).
Para analizar un archivo de código fuente de Emacs Lisp, suponiendo que el objetivo es obtener información sobre def.*
formularios de nivel superior , se puede hacer algo similar a lo siguiente.
(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)))))
Esto se puede extender fácilmente a defvar
, defconst
, etc.
Para manejar la defun
aparición dentro de los formularios de nivel superior, uno tendría que descender a estos formularios, posiblemente utilizando la recursividad.
(def…)
sexps, no solo las especificaciones de nivel superior? ¿O la interpretación intermedia de las funciones y variables que se definirían si se carga el archivo? ¿O una definición más relajada que incluya formas de nivel superior como(when nil (defun …))
)?