请问有什么方式可以在一个循环内让macro直接引用对象的值?

(defmacro test-macro(pkg)
  `(progn (print ,pkg)))

(cl-loop for pkg in '(1 2 3)
         do (print (macroexpand '(test-macro pkg))))

除了使用eval

(cl-loop for pkg in '(1 2 3)
         do (eval `(test-macro ,pkg)))

这个方向是错的,macro展开在编译期,而值只在运行期才有。

我去,刚发现还可以这样 :scream:

(cl-loop for pkg in '(1 2 3)
         do `,(test-macro pkg))

我想的是怎么直接值传给macro,而不是变量的名字

(let (heads)
  (map-keymap
   (lambda(key cmd)
     (unless (listp cmd)
       (let* ((keyc (key-description (vector key)))
              (hint (cadr (split-string (symbol-name cmd) "git-timemachine-"))))
         (push (list keyc cmd hint) heads))))
   git-timemachine-mode-map)
  (eval `(defhydra maple/git-timemachine
           (:body-pre (git-timemachine) :before-exit (git-timemachine-quit))
           ,@heads ("q" nil "quit" :exit t))))

就像这个例子,除了eval不知道还有什么方式可以直接把heads传给defhydra这个macro

这个想法的方向是不对的,你确实可以让宏在运行时执行,通过在运行时去做eval或宏展开,但宏不应该这样用。

比方说 el 里面的宏,编译成 elc 的时候应该就已经展开完了。

这种问题的正确做法是看 defhydra 这个宏内部展开成什么函数,然后去用那个函数。