Definizione macro

Aug 21 2020

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

2 phils Aug 21 2020 at 09:55

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' concatutilizzo.

Per il resto, probabilmente volevi unire la tua &restargomentazione alla macro espansa con ,@funcs?

Vedi C-hig (elisp)Backquoteper ulteriori informazioni sulla giunzione.

3 q.undertow Aug 21 2020 at 09:02

Per prima cosa (e non sono affatto sicuro che non ci sia un altro problema), la chiamata a expand-file-namenel 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