如何简明地映射列表?

时间:2012-01-30 07:03:36

标签: common-lisp

我正在寻找一种简洁的方法来在多个列表中映射一个可变参数函数,但是我没有像使用MAPCAR那样将列表作为单独的参数传递,而是希望传递一个由任意数量的列表组成的列表,并通过这些列表进行映射包含列表。我事先不知道封闭列表中有多少列表,所以我无法对其进行解构。

我尝试过以各种方式组合MAPCAR和APPLY,但无法理解。我必须放弃使用MAP并明确地编写迭代吗?

这是一个完成我想要的功能:

(defun map-within (fn list-of-lists &optional(maptype #'mapcar))
  "Map FN on the lists contained in LIST-OF-LISTS"
  (cond ((null list-of-lists) nil)
    ((null (cdr list-of-lists)) (car list-of-lists))
    (t
     (funcall maptype fn
         (car list-of-lists)
         (map-within fn (cdr list-of-lists) maptype)))))

,其中

(map-within #'+ '((1 2 3) (10 20 30) (100 200 300))) => (111 222 333)

是否有一些由地图制作的lambda的魔法应用只能用一行来表达?

1 个答案:

答案 0 :(得分:5)

您可以像这样使用apply

(apply #'mapcar #'+ '((1 2 3) (10 20 30) (100 200 300)))
=> (111 222 333)