Jika tujuannya adalah untuk mendapatkan informasi tentang fungsi dan variabel yang sudah ada di lingkungan :
Untuk dokumentasi fungsi dan makro, lihat documentation
fungsi.
Untuk dokumen variabel, gunakan documentation-property
; sebagai contoh:
(documentation-property
'user-init-file 'variable-documentation)
Untuk fungsi arity dan daftar argumen, lihat pertanyaan Emacs.SE ini , jawabannya, dan komentar untuk pertanyaan itu.
(Saya menemukan ini dengan menekan C-h k C-h f
dan membaca kode sumber describe-function
(sama untuk variabel docstring, tetapi belajar describe-variable
).)
Untuk menganalisis file kode sumber Emacs Lisp, dengan asumsi bahwa tujuannya adalah untuk mendapatkan informasi tentang def.*
formulir tingkat atas , orang dapat melakukan sesuatu yang mirip dengan yang berikut ini.
(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)))))
Hal ini dapat dengan mudah diperluas untuk defvar
, defconst
, dll
Untuk menangani defun
muncul di dalam bentuk tingkat atas seseorang harus turun ke bentuk ini, mungkin menggunakan rekursi.
(def…)
sexps, bukan hanya spesifikasi tingkat atas? Atau interpretasi menengah fungsi dan variabel yang akan ditentukan jika file dimuat? Atau definisi yang lebih santai yang mencakup bentuk tingkat atas seperti(when nil (defun …))
)?