(apply map list '((a b c) (1 2 3))) => ((a 1) (b 2) (c 3))
我无法真正地围绕这个表达。这里发生了什么?
答案 0 :(得分:7)
您需要了解的第一件事是map
的作用。 map
接受一个函数和一个或多个列表。 map
然后在每个列表的第一个元素上调用该函数,这将成为map
返回的列表中的第一个值。 map
为每个列表中的第二个元素重复此操作,依此类推,直到其中一个列表用完元素。例如:
(map + '(1 2 3) '(4 5 6)) => (5 7 9)
map
首先在每个列表的第一个参数1和4上调用+
,得到5作为结果列表中的第一个值。其他值的计算方法相同。
apply
通过将函数,一堆值和列表作为最后一个参数来工作。 apply
首先将除函数之外的所有参数附加到作为其最后一个参数传入的列表中,以便:
(apply map list '((a b c) (1 2 3)))
变为
(apply map (list list '(a b c) '(1 2 3)))
apply
然后调用传递给它的函数,列表的每个元素作为单独的参数,因此上面变为:
(map list '(a b c) '(1 2 3))
map
将在每个列表的第一个参数上调用list
并获取(a 1)
,这将成为结果列表中的第一个值。其余的列表也会发生同样的事情。
答案 1 :(得分:1)
apply
很容易作为代码的纯文本转换来处理,来自
(apply map list '( (a b c) (1 2 3) ))
到
( map list '(a b c) '(1 2 3) )