Définition de macro

Aug 21 2020

Je suis en train de «modulariser» mon fichier de configuration et j'ai rencontré un problème concernant les macros elisp.

En raison de la façon dont je définis mes modules de configuration, je me suis retrouvé avec un tas de blocs de code comme suit:

(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))

Comme je le répétais beaucoup, j'ai essayé de définir une macro pour avoir des fichiers de configuration plus lisibles. C'est la première fois que j'écris des macros dans elisp, c'est donc ce que j'ai obtenu:

(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))

J'essaye de l'appeler avec

(j/con-load "latex"
  (leader
    :infix "o"
    "e" '(ebib :which-key "ebib"))
  (some-function x y z))

mais cela ne fonctionne tout simplement pas.

Qu'est-ce que je fais de mal ici?

Réponses

2 phils Aug 21 2020 at 09:55

M-x pp-macroexpand-last-sexpest votre ami. Il vous montre le code dans lequel votre macro se développe, à savoir:

(with-eval-after-load
    (expand-file-name
     (concat "latex" ".el" j/config-path))
  funcs)

Ce qui dit à Emacs d'évaluer la variable funcs(qui n'existera probablement pas) si jamais elle charge une bibliothèque </path/to/current/default-directory>/latex.el</value/of/j/config-path>(ce qui semble plutôt improbable).

@ q.undertow a couvert l' concatutilisation.

Pour le reste, vous vouliez probablement épisser votre &restargument dans la macro développée avec ,@funcs?

Voir C-hig (elisp)Backquotepour plus d'informations sur l'épissage.

3 q.undertow Aug 21 2020 at 09:02

D'une part (et je ne suis pas du tout sûr qu'il n'y ait pas d'autre problème), l'appel à expand-file-namedans le corps de la macro est brouillé. Ça devrait être

(expand-file-name (concat ,module ".el") j/config-path)

Vous pouvez également évaluer la concatentation au moment du développement de la macro:

(expand-file-name ,(concat module ".el") j/config-path)

J'espère que cela t'aides