常见的lisp如何转换其余参数列表

时间:2011-11-14 08:52:33

标签: rest common-lisp

我是普通lisp的新手,因此我的问题可能非常简单,但我没有找到任何内容,也许我使用了错误的搜索字词。

我遇到了以下问题: 我有一个功能,可以在任意数量的参数上进行特殊添加。下一步是将该函数应用于任意数量的相同大小的列表,结果将是该大小的列表。 如果我打电话,它会工作 (mapcar #'addition list1 list2 ...) 但如果我必须定义一个功能 (defun list-add (list &rest lists) (mapcar #'addition list lists)) 它不起作用,因为& rest list现在是一个列表列表。需要使用所有参数作为序列调用函数添加,因此无法进行递归调用。

有没有人有解决方案?

3 个答案:

答案 0 :(得分:5)

请参阅APPLY

另请注意CALL-ARGUMENTS-LIMIT的价值。

显而易见的解决方案是:

(defun list-add (&rest lists)
  (apply #'mapcar #'addition lists))

答案 1 :(得分:0)

我不确定我是否正确地提出了问题但是尝试

(defun list-add (list &rest lists)
  (mapcar (lambda (l) (apply #'addition list l))
          lists))

答案 2 :(得分:0)

我不确定这是否比已经提供的答案更好或更差,但这是我想出的:

 (defun list-add (first-required-list &rest other-lists)
  (let ((all-lists (cons first-required-list
                         other-lists)))
    (reduce (lambda (left-list right-list)
              (mapcar #'addition left-list right-list))
        all-lists)))