在Hyperspec中,他们有maplist的这个例子:
(maplist #'append '(1 2 3 4) '(1 2) '(1 2 3))
=> ((1 2 3 4 1 2 1 2 3) (2 3 4 2 2 3))
我不太了解。按照明显的逻辑,我会猜到
=>((1 2 3 4 1 2 1 2 3) (2 3 4 2 2 3) (3 4 3) (4))
似乎因为在制作了两个子列表之后我们已经“耗尽”了中间列表,所以游戏结束了。为什么?我错过了什么?
答案 0 :(得分:3)
你断言中间列表“耗尽”后它停止似乎是正确的;来自the documentation:
maplist与mapcar类似,只是该函数应用于列表的连续子列表。 function 首先应用于列表本身,然后应用于每个列表的cdr,然后应用于每个列表的cdr的cdr,依此类推。
因此,在命中最短列表的末尾之后它会停止是有意义的,因为从该列表中将没有更多的值可以使用,并且似乎每次都在尝试使用所有(子)列表。
修改强>
正如Samuel Edwin Ward所指出的那样:
描述mapcar的部分包括“当最短列表用完时迭代终止,其他列表中的多余元素被忽略。”
快速进行REPL实验:
[1]> (maplist #'append '(1 2 3 4) '(1 2) '(1 2 3))
((1 2 3 4 1 2 1 2 3) (2 3 4 2 2 3))
[2]> (maplist #'append '(1 2 3 4) '(1 2 3) '(1 2))
((1 2 3 4 1 2 3 1 2) (2 3 4 2 3 2))
[3]> (maplist #'append '(1 2 3 4) '(1 2 3) '(1 2 5))
((1 2 3 4 1 2 3 1 2 5) (2 3 4 2 3 2 5) (3 4 3 5))