Definição macro
Estou no processo de "modularizar" meu arquivo de configuração e encontrei um problema envolvendo macros elisp.
Por causa da maneira como estou definindo meus módulos de configuração, acabei com um monte de blocos de código como o seguinte:
(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 estava repetindo muito isso, tentei definir uma macro para ter arquivos de configuração mais legíveis. É a primeira vez que escrevo macros em elisp, então terminei com isto:
(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))
Estou tentando chamá-lo com
(j/con-load "latex"
(leader
:infix "o"
"e" '(ebib :which-key "ebib"))
(some-function x y z))
mas simplesmente não funciona.
O que estou fazendo de errado aqui?
Respostas
M-x pp-macroexpand-last-sexpé seu amigo. Ele mostra o código para o qual sua macro está se expandindo, que é:
(with-eval-after-load
(expand-file-name
(concat "latex" ".el" j/config-path))
funcs)
Que diz ao Emacs para avaliar a variável funcs(que provavelmente não existirá) se alguma vez carregar uma biblioteca </path/to/current/default-directory>/latex.el</value/of/j/config-path>(o que parece bastante improvável de ocorrer).
@ q.undertow cobriu o concatuso.
De resto, você provavelmente gostaria de unir seu &restargumento na macro expandida com ,@funcs?
Veja C-hig (elisp)Backquotepara mais informações sobre emendas.
Por um lado (e não tenho certeza de que não haja outro problema), a chamada para expand-file-nameno corpo da macro está embaralhada. Deveria ser
(expand-file-name (concat ,module ".el") j/config-path)
Além disso, você pode querer avaliar a concatentação no tempo de expansão da macro:
(expand-file-name ,(concat module ".el") j/config-path)
espero que isto ajude