マクロ定義

Aug 21 2020

設定ファイルを「モジュール化」している最中で、elispマクロに関連する問題が発生しました。

構成モジュールを定義する方法が原因で、次のような一連のコードブロックが作成されました。

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

私はそれを何度も繰り返していたので、より読みやすい構成ファイルを持つようにマクロを定義しようとしました。elispでマクロを書くのは初めてなので、これが私が最終的に得たものでした:

(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/con-load "latex"
  (leader
    :infix "o"
    "e" '(ebib :which-key "ebib"))
  (some-function x y z))

しかし、それは機能しません。

私はここで何が間違っているのですか?

回答

2 phils Aug 21 2020 at 09:55

M-x pp-macroexpand-last-sexpあなたの友達です。マクロが展開されているコードが表示されます。これは次のとおりです。

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

これはfuncs、ライブラリをロードした場合に変数(おそらく存在しない)を評価するようにEmacsに指示します(</path/to/current/default-directory>/latex.el</value/of/j/config-path>これは発生する可能性がかなり低いようです)。

@ q.undertowがconcat使用法をカバーしています。

休息のために、あなたはおそらくしたいスプライスあなた&restと拡大マクロに引数を,@funcs

C-hig (elisp)Backquoteスプライシングの詳細については、を参照してください。

3 q.undertow Aug 21 2020 at 09:02

一つには(そして私は別の問題がないかどうかはまったくわかりませんが)、expand-file-nameマクロ本体での呼び出しがスクランブルされています。そのはず

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

また、マクロ展開時に連結を評価することもできます。

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

お役に立てれば