Makro tanımı

Aug 21 2020

Yapılandırma dosyamı "modülerleştirme" sürecindeyim ve elisp makrolarıyla ilgili bir sorunla karşılaştım.

Yapılandırma modüllerimi tanımlama şeklimden dolayı, aşağıdaki gibi bir grup kod bloğu elde ettim:

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

Bunu çok tekrarladığım için, daha okunabilir yapılandırma dosyalarına sahip olmak için bir makro tanımlamaya çalıştım. Bu benim elisp'de ilk kez makro yazıyorum, bu yüzden bulduğum şey buydu:

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

İle aramaya çalışıyorum

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

ama işe yaramıyor.

Burada neyi yanlış yapıyorum?

Yanıtlar

2 phils Aug 21 2020 at 09:55

M-x pp-macroexpand-last-sexpsenin arkadaşın. Size makronuzun içine genişlediği kodu gösterir, yani:

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

Bu, Emacs'a funcsbir kitaplık yüklediğinde değişkeni (muhtemelen mevcut olmayacak) değerlendirmesini söyler </path/to/current/default-directory>/latex.el</value/of/j/config-path>.

@ q.undertow concatkullanımı kapsamıştır .

Geri kalanı için, muhtemelen istedi splice sizin &restile genişletilmiş makro içine argüman ,@funcs?

C-hig (elisp)BackquoteEkleme hakkında daha fazla bilgi için bakın .

3 q.undertow Aug 21 2020 at 09:02

Birincisi (ve başka bir sorun olmadığından hiç emin değilim), expand-file-namemakro gövdede yapılan çağrı karmaşıktır. Olmalı

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

Ayrıca, birleştirmeyi makro genişletme zamanında değerlendirmek isteyebilirsiniz:

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

Bu yardımcı olur umarım