Definicja makra

Aug 21 2020

Jestem w trakcie "modularyzacji" mojego pliku konfiguracyjnego i napotkałem problem z makrami elisp.

Ze względu na sposób, w jaki definiuję moje moduły konfiguracyjne, otrzymałem kilka bloków kodu w następujący sposób:

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

Ponieważ często to powtarzałem, próbowałem zdefiniować makro, aby mieć bardziej czytelne pliki konfiguracyjne. Po raz pierwszy piszę makra w elisp, więc tak oto skończyłem:

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

Próbuję to nazwać

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

ale to po prostu nie działa.

Co ja tu robię źle?

Odpowiedzi

2 phils Aug 21 2020 at 09:55

M-x pp-macroexpand-last-sexpjest twoim przyjacielem. Pokazuje kod, do którego rozwija się Twoje makro, czyli:

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

Co mówi Emacsowi, aby ocenił zmienną funcs(która prawdopodobnie nie będzie istniała), jeśli kiedykolwiek załaduje bibliotekę </path/to/current/default-directory>/latex.el</value/of/j/config-path>(co wydaje się raczej mało prawdopodobne).

@ q.undertow obejmuje concatużycie.

Co do reszty, prawdopodobnie chciałeś połączyć swój &restargument w rozszerzone makro za pomocą ,@funcs?

Zobacz, C-hig (elisp)Backquoteaby dowiedzieć się więcej o splataniu.

3 q.undertow Aug 21 2020 at 09:02

Po pierwsze (i wcale nie jestem pewien, czy nie ma innego problemu), wywołanie expand-file-namew treści makra jest zaszyfrowane. Powinno być

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

Możesz również chcieć ocenić konkatentację w czasie rozwijania makra:

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

mam nadzieję że to pomoże