(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)))
(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展开在编译期,而值只在运行期才有。
我去,刚发现还可以这样
(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 这个宏内部展开成什么函数,然后去用那个函数。