Definisi makro

Aug 21 2020

Saya sedang dalam proses "memodulasi" file konfigurasi saya dan mengalami masalah yang melibatkan makro elisp.

Karena cara saya mendefinisikan modul konfigurasi saya, saya berakhir dengan sekumpulan blok kode sebagai berikut:

(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))

Karena saya sering mengulanginya, saya mencoba menentukan makro agar memiliki file konfigurasi yang lebih mudah dibaca. Ini adalah pertama kalinya saya menulis makro di elisp, jadi inilah yang akhirnya saya dapatkan:

(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))

Saya mencoba untuk menyebutnya dengan

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

tapi itu tidak berhasil.

Apa yang saya lakukan salah di sini?

Jawaban

2 phils Aug 21 2020 at 09:55

M-x pp-macroexpand-last-sexpadalah temanmu. Ini menunjukkan kepada Anda kode yang dikembangkan makro Anda, yaitu:

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

Yang memberi tahu Emacs untuk mengevaluasi variabel funcs(yang mungkin tidak akan ada) jika variabel tersebut pernah memuat pustaka </path/to/current/default-directory>/latex.el</value/of/j/config-path>(yang tampaknya agak tidak mungkin terjadi).

@ q.undertow telah mencakup concatpenggunaan.

Selebihnya, Anda mungkin ingin menggabungkan&rest argumen Anda ke makro yang diperluas dengan ,@funcs?

Lihat C-hig (elisp)Backquotelebih lanjut tentang penyambungan.

3 q.undertow Aug 21 2020 at 09:02

Untuk satu hal (dan saya sama sekali tidak yakin tidak ada masalah lain), panggilan ke expand-file-namedalam badan makro diacak. Harus

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

Anda juga mungkin ingin mengevaluasi concatentation pada waktu ekspansi makro:

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

semoga ini membantu