【发布时间】:2015-10-15 22:39:59
【问题描述】:
我必须在 Common Lisp 中编写递归宏。
我有一个搜索列表中最大元素的函数。例如它返回
45 用于列表 (2 4 6 42 5 45 3)。现在我要把它转换成递归宏。
这是我的代码:
(defmacro mymax (values)
(cond
((= (length values) 1) `(write (car ,values)))
((> (car values) (cadr values)) (mymax (list (car values) (cddr values))))
(t (mymax (cdr values)))
)
)
它不起作用。编译错误:“LIST 不是实数”。我尝试了 '`' 和 ',' 的不同组合 - 没有结果。如何更正我的代码以使宏的结果为数字?
宏调用:
(write (mymax (list 3 5 6 7 8)))
或
(write (mymax (cons 3 5 6 7 8)))
或
(write (mymax '(3 5 6 7 8)))
所有这些调用都以相同的结果结束。
【问题讨论】:
-
为什么必须是宏?这是一个硬件任务吗?你如何调用你的宏?
-
这没什么意义...
-
宏获取代码并生成代码。它应该生成什么代码?
-
它应该如何从列表
(list 1 2 3)中生成最大数量?list不是数字。 -
(mymax a)应该如何工作?宏应该如何计算符号a的最大值。a不是数字列表。请记住,宏获取源代码,这里是a,而不是评估参数。
标签: recursion macros lisp common-lisp