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

Pau*_*ter 1 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)))))
Run Code Online (Sandbox Code Playgroud)

哪里

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

由地图制成的lambda是否有某种神奇的应用,可以仅用一行来表达呢?

Dai*_*rod 5

您可以这样使用apply

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