此函数应该从列表内部删除所有括号。我不是问如何做到这一点(我已经知道这将是一个重复)我问为什么当我运行我的解决方案,它打破并告诉我
"错误:变量APPEND未绑定。"
这是我的代码
(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编程。如果我的错误是由括号放置或其他新手错误引起的,我不知道,因为我仍在适应功能语言编程。
答案 0 :(得分:2)
这里的很多东西都行不通。像
这样的东西((flatten(first lst)) flatten(rest lst))
是对函数追加的函数调用,但只有一个参数:
(flatten (first lst))
喜欢一个函数调用,除了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
(list(first lst) flatten(rest lst)))
不是变量,所以你得到的是未绑定的变量错误。即使它是,而且确实如此,当您尝试评估时,您会收到错误
list
因为这是对(first lst)
的函数调用,其中flatten
作为其第一个参数(很好),(rest lst)
作为其第二个参数(另一个未绑定的变量),并且{{ 1}}作为它的第三个参数(很好)。请记住,Lisp中的函数调用看起来像
(<function-name> <arg1>...)
所以你写(list (flatten (first lst)) (flatten (rest lst)))
,但是,你可能真的想要(append (flatten ...) (flatten ...))
。也就是说,关于如何在Stack Overflow上展平列表已经存在很多问题。其中一些可能更具启发性。