Nếu mục tiêu là lấy thông tin về các hàm và biến đã có trong môi trường :
Để biết các hàm của hàm và macro, hãy xem documentation
hàm.
Đối với các tài liệu biến, sử dụng documentation-property
; ví dụ:
(documentation-property
'user-init-file 'variable-documentation)
Để biết tính chất của hàm và danh sách đối số, hãy xem câu hỏi Emacs.SE này , câu trả lời và nhận xét cho câu hỏi.
(Tôi đã tìm thấy điều này bằng cách nhấn C-h k C-h f
và lướt qua mã nguồn của describe-function
(tương tự đối với các tài liệu thay đổi, nhưng nghiên cứu describe-variable
).)
Để phân tích tệp mã nguồn Lisp của Emacs, giả sử rằng mục tiêu là lấy thông tin về các def.*
biểu mẫu cấp cao nhất , người ta có thể làm một cái gì đó tương tự như sau.
(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)))))
Điều này có thể dễ dàng mở rộng để defvar
, defconst
vv
Để xử lý defun
xuất hiện bên trong các biểu mẫu cấp cao nhất, người ta sẽ phải chuyển sang các biểu mẫu này, có thể sử dụng đệ quy.
(def…)
, không chỉ là thông số kỹ thuật cấp cao nhất? Hoặc giải thích trung gian của các chức năng và các biến sẽ được xác định nếu tệp được tải? Hoặc một định nghĩa thoải mái hơn bao gồm các hình thức cấp cao nhất như(when nil (defun …))
)?