【发布时间】:2013-12-09 19:10:00
【问题描述】:
曾几何时,我在玩宏并想出了这个:
(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 并没有说明递归宏有什么特别之处。
而且我仍然很想知道是否有办法将这种宏扩展到它的末尾。
【问题讨论】:
-
这似乎是一个不适合向学生教授宏的示例。您可以删除该宏中的每个撇号、逗号和反引号,将其更改为一个函数,它的计算结果完全相同。 (事实上,你应该这样做。)我无意冒犯,我理解对一个简单示例的渴望,但是向人们展示 asinine 宏似乎是一种快速的方法,不仅可以混淆他们对概念的理解,而且可以将它们关闭到语言作为一个整体。
标签: macros common-lisp