Definição macro

Aug 21 2020

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

2 phils Aug 21 2020 at 09:55

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.

3 q.undertow Aug 21 2020 at 09:02

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