Eager macroexpand.过程是什么?自己写的宏不会被eval。

(defmacro macro-a (name &rest args)
  "doc"
  (declare (indent 1))
  (let ((a (list "s" "o")))
    (message "macro-a")
    `(prog1
       ,@(mapcar (lambda (elm) `(my-func ',elm)) a))))

(defmacro macro-b (name &rest args)
  "doc'"
  (declare (indent 1))
  `(macro-a ,name ,@args)               ;这个调用没作用,没有被eval。
                                        ;除非写为(eval `(macro-a ,name ,@args))
  `(leaf ,name ,@args))                 ;leaf 却能够正常的eval展开。
                                        ;什么原因呢?
                                    

(macro-b meow :require t)
   

上面的代码,为什么 (leaf ,name ,@args) 求值了,而我写的 (macro-a ,name ,@args) 却没有被求值,搞不清楚哪里问题。搞不清 eager macroexpand的过程机制。求指点。

我大概知道什么原因了。macro-b 的调用只返回了 leaf 的表达式,所以只有 macro-a 没有被返回,只是副作用,没啥作用。 可以把 macro-a 和 leaf 组成一个表达式一起返回,就起作用了。

欢迎高手指正。