带有附加输出的常见lisp maplist

时间:2014-02-19 18:03:20

标签: common-lisp

在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))

似乎因为在制作了两个子列表之后我们已经“耗尽”了中间列表,所以游戏结束了。为什么?我错过了什么?

1 个答案:

答案 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))