Common lisp 如何简洁地映射列表列表?

Common lisp 如何简洁地映射列表列表?,common-lisp,Common Lisp,我正在寻找一种简洁的方法来跨多个列表映射一个变量函数,但是我不想像MAPCAR那样将列表作为单独的参数传递,而是希望传递一个由任意数量的列表组成的列表,并映射这些包含的列表。我事先不知道封闭列表中有多少个列表,因此无法对其进行分解 我尝试过将MAPCAR和APPLY以各种方式结合在一起,但无法解决。我必须放弃使用MAP而直接编写迭代吗 这里有一个函数可以满足我的要求: (defun map-within (fn list-of-lists &optional(maptype #'mapc

我正在寻找一种简洁的方法来跨多个列表映射一个变量函数,但是我不想像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)))))
在哪里


有没有用地图制作的lambda的神奇应用程序可以用一行来表达这一点?

你可以像这样使用
apply

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

您可以像这样使用
apply

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

谢谢,这比我想象的要少很多,很明显我没有想到要尝试一下。我的想法是APPLY接受了两个参数,一个函数和一个列表,并将列表元素上的函数作为参数调用,而实际上它对其余的参数调用函数,同时特别处理最后一个参数。@PaulRichter:是的,你应该看一下。可能只适用于调用参数限制以下的列表,由于解决方案使用APPLYCheers,我不知道我能用mapcarThanks做到这一点,这远没有我想象的那么神奇,显然我没有想到要尝试一下。我的想法是APPLY接受了两个参数,一个函数和一个列表,并将列表元素上的函数作为参数调用,而实际上它对其余的参数调用函数,同时特别处理最后一个参数。@PaulRichter:是的,你应该看一下。可能只适用于调用参数限制以下的列表,由于该解决方案使用APPLYCheers,我不知道我可以用mapcar做到这一点