我有一个函数可以处理传递给它的任何内容,并返回一个基于该列表的列表。
如何处理传递给它的任何参数并将其混合到一个包含每个值的列表中?
另外,'
让我很烦,因为它使得从 somefunction1 中调用 somefunction2 有问题。有没有解决的办法?在我的例子中,拥有一个可以或多或少地接受任何东西作为参数的过于通用的函数会很有用,甚至是其他函数。
函数的可能参数:
- NIL(应视为 0)
- 一个数字
- 数字列表
- 一个空列表(应该被视为0)
- 几个列表,其中一些可能包含也可能不包含 NIL、数字或
- 更多列表
基本上,我想要的是:
(somefunction '() 1 2 3 4 '(1 2 3 4 ) '(1))
...应该合并/捣碎成:
(0 1 2 3 4 1 2 3 4 1)
...在处理之前
注意:这是 this question 的后续行动
最佳答案
应该这样做:
(defun weird-flatten (a)
(cond ((null a) (list 0))
((atom a) (list a))
(t (mapcan #'weird-flatten a))))
(defun foo (&rest args) (weird-flatten args))
编辑:注意到您正在尝试将此作为学习练习,所以我想我应该解释一下。第一个函数是一个非常基本的递归。唯一奇怪的是它使用 mapcan
而不是 mapcar
,所以结果被合并到一个平面列表而不是保留与参数相同的形状(嗯。 ..mapcar
接受一个 n 元函数和 n 个列表作为参数,并将该函数应用于列表的每个元素,返回结果序列;不确定这对您来说是否太基础了)。
foo
函数有点特殊,因为它需要一个 &rest
arg。这意味着您可以将任意数量的东西传递给函数,并且符号 args
将绑定(bind)到传递的所有参数的列表。
出于好奇,为什么需要将 NIL
视为零?
关于lisp - 可以接受任何东西作为参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8997474/