lisp - 可以接受任何东西作为参数的函数

标签 lisp common-lisp

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

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

另外,' 让我很烦,因为它使得从 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/

相关文章:

lisp - 在Scheme中查找树从根到叶的所有路径

lisp - sbcl Common Lisp incf 警告

lisp - 在 LISP 中,我如何定义一个需要三个参数的函数,这些参数都是不是列表的字符串?

lisp - 搜索包含 lists 或 conses 的列表

inheritance - 普通 lisp 中的多个构造函数

for-loop - 方案中的定义语法问题

function - 替换 lisp 中的元素

recursion - 在 lisp 代码中修复这个未定义的函数?

common-lisp - Clozure CL 中长时间运行的应用程序的应用程序交付

garbage-collection - 如何修复 Mac Common Lisp 5.0 中的 GC 错误?