【发布时间】:2012-01-04 06:00:24
【问题描述】:
这个宏的递归定义做了它应该做的(从 1 到 n 的整数相加):
(defmacro sum-int-seq (n)
`(cond
((equal 0 ,n) 0)
(t (+ ,n (sum-int-seq (- ,n 1))))))
例如(sum-int-seq 5) 给出 15。
但是为什么它会起作用?当宏被扩展时,我得到了这个:
(macroexpand '(sum-int-seq 5))
(IF (EQUAL 0 5) 0 (+ 5 (SUM-INT-SEQ (- 5 1))))
但是因为 sum-int-seq 是一个宏,所以宏求值应该变成一个无限循环。编译器会创建一个递归函数吗?如果这个定义创建了一个递归函数,有没有办法递归地定义宏?
(为了简洁起见,这是一个愚蠢的例子,一个函数当然会更好地工作)
【问题讨论】:
标签: recursion macros lisp common-lisp