Định nghĩa macro

Aug 21 2020

Tôi đang trong quá trình "modularizing" tệp cấu hình của mình và gặp phải sự cố liên quan đến macro elisp.

Do cách tôi xác định các mô-đun cấu hình của mình, tôi đã kết thúc với một loạt các khối mã như sau:

(with-eval-after-load (expand-file-name
                       "latex.el"
                       j/config-path)
  (leader
    :infix "o"
    "e" '(ebib :which-key "ebib"))
  (some-function x y z))

Vì tôi đã lặp đi lặp lại điều đó rất nhiều, tôi đã cố gắng xác định một macro để có nhiều tệp cấu hình dễ đọc hơn. Đây là lần đầu tiên tôi viết macro trong elisp, vì vậy đây là những gì tôi đã kết thúc:

(defmacro j/con-load (module &rest funcs)
      "TODO doc goes here"
      `(with-eval-after-load
           (expand-file-name (concat ,module ".el" j/config-path))
         funcs))

Tôi đang cố gọi nó bằng

(j/con-load "latex"
  (leader
    :infix "o"
    "e" '(ebib :which-key "ebib"))
  (some-function x y z))

nhưng nó không hoạt động.

Tôi làm gì sai ở đây?

Trả lời

2 phils Aug 21 2020 at 09:55

M-x pp-macroexpand-last-sexplà bạn của bạn. Nó hiển thị cho bạn mã mà macro của bạn đang mở rộng thành, đó là:

(with-eval-after-load
    (expand-file-name
     (concat "latex" ".el" j/config-path))
  funcs)

Điều này yêu cầu Emacs đánh giá biến funcs(có thể sẽ không tồn tại) nếu nó tải một thư viện </path/to/current/default-directory>/latex.el</value/of/j/config-path>(điều này dường như không bao giờ xảy ra).

@ q.undertow đã đề cập đến concatviệc sử dụng.

Đối với phần còn lại, bạn có thể muốn ghép&rest đối số của mình vào macro được mở rộng với ,@funcs?

Xem C-hig (elisp)Backquoteđể biết thêm về nối.

3 q.undertow Aug 21 2020 at 09:02

Đối với một điều (và tôi không chắc là không có vấn đề gì khác), lệnh gọi đến expand-file-nametrong phần thân macro bị xáo trộn. Nó nên được

(expand-file-name (concat ,module ".el") j/config-path)

Ngoài ra, bạn có thể muốn đánh giá sự hòa hợp tại thời gian mở rộng macro:

(expand-file-name ,(concat module ".el") j/config-path)

hi vọng điêu nay co ich