如何在 elisp 中将列表作为参数提供给宏?

How to give a list as arguments to a macro in elisp?

我想实现这样的目标:

(setq my-global-keybindings
      '(([?\C-x ?\C-d] . dired)
        ([?\C-x ?\C-b] . ibuffer)
        ([?\C-x b] . ivy-switch-buffer)))

(apply #'bind-keys* my-global-keybindings)

但是 bind-keys* 在这里是一个宏

在绑定键的特定情况下,我认为更好的选择是寻找一个函数来替换那个 bind-keys* 宏(我没有看到任何理由为什么它应该是一个宏而不是一个功能)。

但是对于更一般的问题,我会这样做:

(defmacro my-multi-bind-keys (bindings)
  (macroexp-progn
    (mapcar (lambda (binding)
             `(bind-keys* ,@binding))
            bindings)))
(my-multi-bind-keys (([?\C-x ?\C-d] dired)
                     ([?\C-x ?\C-b] ibuffer)
                     ([?\C-x b] ivy-switch-buffer)))

请注意,像您一样使用 setq 是有问题的:编译期间需要扩展宏,但 setq 不应由编译器执行(它应该是 compiled 由编译器编译为 运行 当代码稍后执行时)所以宏没有合理的方法来访问 var 的值(至少在时间旅行开始工作之前) .