Makro tanımı
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
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 .
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