defmacro宏定义的一个出乎意料的结果

下面这个宏, 展开后, message打印一行会丢失, 这是什么原理?

(defmacro test-macro1 (arg &rest body)
  (declare (indent 1))
  `(message "arg: %s" ,arg)
  `(progn
	 ,@body))
(macroexpand '(test-macro1 123 (eobp)))

展开后结果:

(progn (eobp))

有点出乎意料, 对宏了解不深, 只是简单使用, 这个情况是正常的吗?

(defmacro t1 (arg &rest body)
  `(progn
     (message "arg: %s" ,arg)
     ,@body))

宏只能返回一个Sexp作为结果。如果要执行多条语句,用progn或其他block包裹。

你可以把macro看成一个返回Sexp的call by name的编译期使用的函数

看到这个规律了,不过defmacro的doc说明好像没提这个,导致有点迷惑,已经改成这样了

这东西算的上一个lisp常识。