我的展平功能有什么问题

What is wrong with my flatten function

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

"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:First 它检查列表是否为空。基本情况 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 虽然不是变量,但您会遇到未绑定变量错误。即使它是,而且它是真的,当你尝试评估

时你会得到一个错误
(list(first lst) flatten(rest lst)))

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

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

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