我正在寻找一种简洁的方法来在多个列表中映射一个可变参数函数,但是我没有像使用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的魔法应用只能用一行来表达?
答案 0 :(得分:5)
您可以像这样使用apply
:
(apply #'mapcar #'+ '((1 2 3) (10 20 30) (100 200 300)))
=> (111 222 333)