Làm thế nào để lấy tài liệu từ các hàm và biến?


11

Tôi đang cố gắng viết một hàm sẽ lấy các tài liệu từ bất kỳ giới tính nào trong một tệp phù hợp (def.*).

Tôi muốn cả hai có thể truy xuất bất kỳ hàm / macro nào, cũng như bất kỳ biến nào được xác định. Đối với các biến tôi sẽ muốn chuỗi doc, trong khi đối với bất kỳ hàm nào tôi cũng muốn có danh sách đối số.


1
Để làm rõ: bạn có tệp nguồn Elisp (giải thích của tôi) hay bạn có một loạt các biến và hàm trong môi trường Emacs hiện tại (diễn giải của Constantine)? Và nếu diễn giải đầu tiên, bạn có thực sự muốn tất cả các giới tính (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 …)))?
Gilles 'SO- ngừng trở nên xấu xa'

Ban đầu tôi đã muốn cái đầu tiên, tuy nhiên dựa trên sự giải thích của Constantine, tôi đã có thể có được một triển khai chức năng giúp tôi có được thứ tôi cần. Mục tiêu là chuyển đổi nguồn elisp thành tài liệu (viết bằng Org) dựa trên Docstrings.
Jonathan Leech-Pepin

Với cách hiểu thứ hai, tích hợp describe-functionvà bạn bè thực hiện khá tốt những gì bạn muốn (danh sách tài liệu và đối số).
T. Verron

Câu trả lời:


10

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 documentationhà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 fvà 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, defconstvv

Để xử lý defunxuấ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.


2
+1 để cho độc giả biết cách tự tìm thông tin này. Đó là bài học quan trọng hơn của hai người mà bạn đã dạy.
vẽ

@Drew Có vẻ như chúng ta đang ở trong một tình huống kỳ lạ: mục tiêu của trang này là làm cho nó trở nên lỗi thời Điều này sẽ tạo ra một cuộc thảo luận thú vị trong trò chuyện :)
Sean Allred

4
@SeanAllred Dạy mọi người học không dừng lại các câu hỏi, nó chỉ làm cho họ tốt hơn.
Malabarba

3
+1 cho Malabarba. Mục đích của trang web này (IMHO) là để trả lời những gì Emacs không thể trả lời hoặc không trả lời tốt hoặc dễ dàng . Tương tự: Đối với trang web Ngôn ngữ và cách sử dụng tiếng Anh, một lý do để đóng các câu hỏi là " Câu hỏi có thể được trả lời bằng cách sử dụng các tài liệu tham khảo phổ biến có sẵn ngoài chủ đề *". (StackOverflow là tương tự.) Chúng ta không cần thiết như cực đoan, nói rằng câu hỏi mà Emacs chính nó có thể trả lời là off-topic , nhưng ý tưởng tương tự nên được áp dụng: được sử dụng để cố gắng tìm ra câu trả lời đầu tiên . Trong trường hợp của chúng tôi, điều đó có nghĩa là bằng cách hỏi Emacs .
vẽ

@Drew Điểm công bằng :)
Sean Allred
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.