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-sexp
es 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 concat
uso.
Por lo demás, probablemente deseaba unir su &rest
argumento en la macro expandida con ,@funcs
?
Consulte C-hig (elisp)Backquote
para 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-name
en 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