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是确保基因在某种程度上与所需输出保持一致的一种方法。