Definizione macro
Sono in procinto di "modularizzare" il mio file di configurazione e mi sono imbattuto in un problema con le macro elisp.
A causa del modo in cui sto definendo i miei moduli di configurazione, mi sono ritrovato con un mucchio di blocchi di codice come i seguenti:
(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))
Dato che lo ripetevo molto, ho provato a definire una macro per avere file di configurazione più leggibili. È la prima volta che scrivo macro in elisp, quindi questo è ciò che ho ottenuto:
(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))
Sto cercando di chiamarlo con
(j/con-load "latex"
(leader
:infix "o"
"e" '(ebib :which-key "ebib"))
(some-function x y z))
ma semplicemente non funziona.
Cosa sto facendo di sbagliato qui?
Risposte
M-x pp-macroexpand-last-sexp
È tuo amico. Ti mostra il codice in cui si espande la tua macro, ovvero:
(with-eval-after-load
(expand-file-name
(concat "latex" ".el" j/config-path))
funcs)
Il che dice a Emacs di valutare la variabile funcs
(che probabilmente non esisterà) se dovesse mai caricare una libreria </path/to/current/default-directory>/latex.el</value/of/j/config-path>
(cosa che sembra piuttosto improbabile che si verifichi).
@ q.undertow ha coperto l' concat
utilizzo.
Per il resto, probabilmente volevi unire la tua &rest
argomentazione alla macro espansa con ,@funcs
?
Vedi C-hig (elisp)Backquote
per ulteriori informazioni sulla giunzione.
Per prima cosa (e non sono affatto sicuro che non ci sia un altro problema), la chiamata a expand-file-name
nel corpo della macro è codificata. Dovrebbe essere
(expand-file-name (concat ,module ".el") j/config-path)
Inoltre potresti voler valutare la concatentazione al momento dell'espansione della macro:
(expand-file-name ,(concat module ".el") j/config-path)
spero che questo ti aiuti