Definición de macro
Estoy en el proceso de "modularizar" mi archivo de configuración y encontré un problema relacionado con macros elisp.
Debido a la forma en que estoy definiendo mis módulos de configuración, terminé con un montón de bloques de código como el siguiente:
(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))
Como repetía mucho eso, traté de definir una macro para tener archivos de configuración más legibles. Es la primera vez que escribo macros en elisp, así que esto fue lo que terminé con:
(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))
Estoy tratando de llamarlo con
(j/con-load "latex"
(leader
:infix "o"
"e" '(ebib :which-key "ebib"))
(some-function x y z))
pero simplemente no funciona.
¿Qué estoy haciendo mal aquí?
Respuestas
M-x pp-macroexpand-last-sexpes tu amigo. Le muestra el código en el que se está expandiendo su macro, que es:
(with-eval-after-load
(expand-file-name
(concat "latex" ".el" j/config-path))
funcs)
Lo que le dice a Emacs que evalúe la variable funcs(que probablemente no existirá) si alguna vez carga una biblioteca </path/to/current/default-directory>/latex.el</value/of/j/config-path>(lo que parece poco probable que ocurra).
@ q.undertow ha cubierto el concatuso.
Por lo demás, probablemente deseaba unir su &restargumento en la macro expandida con ,@funcs?
Consulte C-hig (elisp)Backquotepara obtener más información sobre el empalme.
Por un lado (y no estoy del todo seguro de que no haya otro problema), la llamada a expand-file-nameen el cuerpo de la macro está codificada. Debería ser
(expand-file-name (concat ,module ".el") j/config-path)
También es posible que desee evaluar la concatenación en el tiempo de expansión de la macro:
(expand-file-name ,(concat module ".el") j/config-path)
espero que esto ayude