Definisi makro
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
M-x pp-macroexpand-last-sexp
adalah 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 concat
penggunaan.
Selebihnya, Anda mungkin ingin menggabungkan&rest
argumen Anda ke makro yang diperluas dengan ,@funcs
?
Lihat C-hig (elisp)Backquote
lebih lanjut tentang penyambungan.
Untuk satu hal (dan saya sama sekali tidak yakin tidak ada masalah lain), panggilan ke expand-file-name
dalam 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