【发布时间】:2018-01-09 14:47:04
【问题描述】:
我一直在尝试在 clojure 中编写一个递归循环,它将打印出列表中的最后一个数字。关键不是我需要得到最后一个数字(我确信有一个内置函数),而是我想更好地理解 clojure 中的递归和宏。所以我有这个宏...
(defmacro loop-do [the-list]
`(if (= (count '~the-list) 1)
(println (first '~the-list))
(loop-do (rest '~the-list))))
但我收到了 stackoverflow 错误。我做错了什么?
【问题讨论】:
-
看看循环/递归函数。
-
在这一行:
(loop-do (rest '~the-list))您将以下列表按字面意思传递给宏:(rest ...),这样您就不会在每一步都减少数据大小。相反,您扩大了列表)) -
但是rest如何扩大列表?我想如果我通过
'(1 2 3 4 5),它只会返回除第一个元素之外的所有内容并将其传递给loop-do? -
我确信有一个内置函数:是的,last
-
它放大了 leetwinski 所说的,因为当您将宏调用为
(loop-do (rest '~the-list))时,您会将未计算的符号列表 ((rest '~the-list)) 传递回宏。(rest '~the-list)在被赋予宏之前不会被评估。如果您想实际练习使用宏,您应该尝试执行实际需要宏的任务。尝试重写核心宏。