【问题标题】:common lisp how to transform list of rest parameterscommon lisp如何转换剩余参数列表
【发布时间】:2011-11-14 08:52:32
【问题描述】:

我是 common lisp 的新手,因此我的问题可能很简单,但我没有找到任何东西,也许我使用了错误的搜索词。

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

有人有解决办法吗?

【问题讨论】:

    标签: rest common-lisp


    【解决方案1】:

    APPLY

    还要注意CALL-ARGUMENTS-LIMIT的值。

    显而易见的解决方案是:

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

    【讨论】:

      【解决方案2】:

      我不确定我的问题是否正确,但请尝试

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

      【讨论】:

        【解决方案3】:

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

         (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)))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多