Definición de macro

Aug 21 2020

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

2 phils Aug 21 2020 at 09:55

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.

3 q.undertow Aug 21 2020 at 09:02

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