我的展平功能有什么问题
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 上展平列表的问题。其中一些可能更有启发性。
此函数用于删除列表内部的所有括号。我不是在问如何做到这一点(我已经知道那会是重复的)我在问为什么当我 运行 我的解决方案时,它会中断并告诉我
"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 上展平列表的问题。其中一些可能更有启发性。