我的展平功能有什么问题

时间:2015-06-24 00:57:36

标签: functional-programming lisp

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

  

"错误:变量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编程。如果我的错误是由括号放置或其他新手错误引起的,我不知道,因为我仍在适应功能语言编程。

1 个答案:

答案 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上展平列表已经存在很多问题。其中一些可能更具启发性。