Lisp 可以接受任何参数的函数

Lisp 可以接受任何参数的函数,lisp,common-lisp,Lisp,Common Lisp,我有一个函数,它处理传递给它的任何内容,并返回一个基于该内容的列表 如何处理并将传递给它的任何参数混合到一个包含每个值的列表中 另外,“也在困扰着我,因为它使得从somefunction1中调用somefunction2成为问题。有办法解决这个问题吗?在我的例子中,如果有一个过于泛型的函数,它可以或多或少地将任何东西作为参数,甚至是其他函数 函数的可能参数: 零(应视为0) 数 数字表 空列表(应视为0) 几个列表中的一些可能包含或不包含零、数字或 更多列表 基本上,我想要的是: (some

我有一个函数,它处理传递给它的任何内容,并返回一个基于该内容的列表

如何处理并将传递给它的任何参数混合到一个包含每个值的列表中

另外,
也在困扰着我,因为它使得从somefunction1中调用somefunction2成为问题。有办法解决这个问题吗?在我的例子中,如果有一个过于泛型的函数,它可以或多或少地将任何东西作为参数,甚至是其他函数

函数的可能参数:

  • 零(应视为0)
  • 数字表
  • 空列表(应视为0)
  • 几个列表中的一些可能包含或不包含零、数字或
  • 更多列表
基本上,我想要的是:

(somefunction '() 1 2 3 4 '(1 2 3 4 ) '(1))
…应合并/合并为:

(0 1 2 3 4 1 2 3 4 1)
。。。在处理之前


注意:这是对

的后续操作。看起来您希望将nils映射为0,然后再映射结果。您还需要&rest关键字(?)将任意数量的参数snarf到单个列表中

(我会考虑制作一些代码,但我不知道CL.)

< P>这是应该做的:

(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
将绑定到传递的所有参数的列表


出于好奇,为什么需要将
NIL
s视为零?

Stackoverflow不是学习编程语言基础知识的好地方。我建议阅读一些关于Lisp或Common Lisp的基本介绍文本。在这里,将详细解释Lisp中参数处理的基本知识。附议@Rainer。让您开始学习ed,签出,和。如果你想进入人工智能领域,可以选择or(但它们不是免费的)。不管值多少钱,NIL和空列表在公共Lisp中都是一样的,用()来突出列表,用NIL来突出列表和符号(因为,我理解,是历史原因)。这是一个涉及遗传算法的大型项目的一部分。基因是自动生成的lisp代码,将NIL映射到0是确保基因在某种程度上与所需输出保持一致的一种方法。