我正在寻找一种在多个列表之间映射可变函数的简明方法,但是我不想像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是否有某种神奇的应用,可以仅用一行来表达呢?
您可以这样使用apply:
(apply #'mapcar #'+ '((1 2 3) (10 20 30) (100 200 300)))
=> (111 222 333)
Run Code Online (Sandbox Code Playgroud)