gpt4 book ai didi

recursion - Common Lisp 中的递归宏

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:21 35 4
gpt4 key购买 nike

我必须在 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)))

所有这些调用都以相同的结果结束。

最佳答案

(a b c)

  • 如果您阅读上面的表格,它是一个包含 3 个符号的列表。
  • 当您评估它时,如果a 未绑定(bind)到宏,则该表单是对a 的函数调用,其中bc 被评估。

'(a b c),又名 (quote (a b c))

  • 如果您阅读这一篇,您会得到一个包含两个元素的列表,第一个是quote,然后是一个包含 3 个符号的列表。
  • 如果您评估该表单,则返回值是一个包含 3 个符号的列表:(a b c)

Lisp 阅读器阅读时给出宏未评估的源代码。

(mymax '(1 2 3))中,'(1 2 3)是未求值形式(quote (1 2 3))。在 (mymax (list 1 2 3)) 中,未计算的参数有 4 个元素,第一个是符号。您应该为宏提供什么,以便它具有以下列表 (1 2 3)

如有疑问,宏展开。

关于recursion - Common Lisp 中的递归宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33159712/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com