gpt4 book ai didi

functional-programming - 我的展平功能有什么问题

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

此函数应该从列表内部删除所有括号。我不是在问如何做到这一点(我已经知道那会是重复的)我在问为什么当我运行我的解决方案时,它会中断并告诉我

"Error: The variable APPEND is unbound."

这是我的代码

(defun flatten (lst)
(cond ((null lst) lst)
((listp (first lst))(append((flatten(first lst)) flatten(rest lst))))
(append(list(first lst) flatten(rest lst)))))

这是它应该如何工作的:1:首先检查列表是否为空。基本情况2:然后它检查它的第一个元素是否是一个列表。如果是,则将该列表附加到列表尾部递归调用的结果中3:最后,如果第一个元素不是子列表,则它将包含该元素的列表附加到尾部递归调用的结果中。

什么不起作用?

编辑


我只想补充一点,这实际上是我第一次使用 lisp 编程。如果我的错误是由于括号放置或其他菜鸟错误引起的,我不知道,因为我仍在适应使用函数式语言进行编程。

最佳答案

这里的很多东西都行不通。有点像

(append ((flatten(first lst)) flatten(rest lst))))

是对函数append 的函数调用,但有一个参数:

((flatten(first lst)) flatten(rest lst))

就像一个函数调用,只是 (flatten (first lst)) 不是您可以调用的函数。即使是,您也会使用两个参数调用 with:

flatten

(rest list)

第二个是有道理的,除了你没有变量list,你只有lst。第一个是变量引用,但您尚未声明变量 flatten

不过,您遇到的特定错误不是其中任何一个。您可能正在使用不是空列表的内容调用您的函数(因此您不在第一个子句中),并且没有列表作为第一个参数(因此您不在第二个子句中)。这意味着您转到第三个子句:

(defun flatten (lst)
(cond ((null lst) lst)
((listp (first lst)) (append ((flatten(first lst)) flatten(rest lst))))
(append (list(first lst) flatten(rest lst)))) ; *here*

在那里,你将评估append,如果它是真的,你将评估

(list(first lst) flatten(rest lst)))

append 虽然不是变量,但您会遇到未绑定(bind)变量错误。即使它是,而且它是真的,当你尝试评估时你会得到一个错误

(list(first lst) flatten(rest lst)))

因为这是对 list 的函数调用,以 (first lst) 作为它的第一个参数(这很好),并且 flatten 作为它的第二个参数(另一个未绑定(bind)变量)和 (rest lst) 作为它的第三个参数(很好)。请记住,Lisp 中的函数调用看起来像

(<function-name> <arg1>...)

所以你写 (list (flatten (first lst)) (flatten (rest lst))),虽然,你可能实际上想要 (append (flatten ...) (展平...))。也就是说,已经有很多关于如何在 Stack Overflow 上展平列表的问题。其中一些可能更有启发性。

关于functional-programming - 我的展平功能有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31015879/

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