Definicja makra
Jestem w trakcie "modularyzacji" mojego pliku konfiguracyjnego i napotkałem problem z makrami elisp.
Ze względu na sposób, w jaki definiuję moje moduły konfiguracyjne, otrzymałem kilka bloków kodu w następujący sposób:
(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))
Ponieważ często to powtarzałem, próbowałem zdefiniować makro, aby mieć bardziej czytelne pliki konfiguracyjne. Po raz pierwszy piszę makra w elisp, więc tak oto skończyłem:
(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))
Próbuję to nazwać
(j/con-load "latex"
(leader
:infix "o"
"e" '(ebib :which-key "ebib"))
(some-function x y z))
ale to po prostu nie działa.
Co ja tu robię źle?
Odpowiedzi
M-x pp-macroexpand-last-sexpjest twoim przyjacielem. Pokazuje kod, do którego rozwija się Twoje makro, czyli:
(with-eval-after-load
(expand-file-name
(concat "latex" ".el" j/config-path))
funcs)
Co mówi Emacsowi, aby ocenił zmienną funcs(która prawdopodobnie nie będzie istniała), jeśli kiedykolwiek załaduje bibliotekę </path/to/current/default-directory>/latex.el</value/of/j/config-path>(co wydaje się raczej mało prawdopodobne).
@ q.undertow obejmuje concatużycie.
Co do reszty, prawdopodobnie chciałeś połączyć swój &restargument w rozszerzone makro za pomocą ,@funcs?
Zobacz, C-hig (elisp)Backquoteaby dowiedzieć się więcej o splataniu.
Po pierwsze (i wcale nie jestem pewien, czy nie ma innego problemu), wywołanie expand-file-namew treści makra jest zaszyfrowane. Powinno być
(expand-file-name (concat ,module ".el") j/config-path)
Możesz również chcieć ocenić konkatentację w czasie rozwijania makra:
(expand-file-name ,(concat module ".el") j/config-path)
mam nadzieję że to pomoże