从前,我在玩宏时想到了这个:
(defmacro my-recursive-fact (n)
(if (= 0 n) '1
(let ((m (1- n)))
`(* ,n (my-recursive-fact ,m)))))
它起作用了。
CL-USER> (my-recursive-fact 5)
120
那么我认为,如果我使用macroexpand
来展开这个宏,就可以为学生展示递归的一个很好的例子:
CL-USER> (macroexpand '(my-recursive-fact 5))
(* 5 (MY-RECURSIVE-FACT 4))
T
也就是说,在这种情况下,macroexpand-1
和macroexpand
没有区别。我相信我在理解macroexpand
方面缺少了一些关键点,而HyperSpec对于递归宏并没有特别说明。
而且我仍然好奇是否有一种方法可以将这种类型的宏扩展到最后。