3

Lisp 的新手。我知道

(mapcar #'list '(1 2) '(3 4)) 

会给

'((1 3) (2 4))

根据我对 apply 工作原理的理解,我希望

(apply #'(lambda (&rest x) (mapcar #'list x)) '((1 2) (3 4)))

返回相同的结果。相反,我得到

'(((1 2)) ((3 4)))

我很困惑,因为

(apply #'append '((1 2) (3 4)))

给我

'(1 2 3 4)

正如预期的那样。到底是怎么回事?

4

1 回答 1

3

简化它。假设您使用A而不是(1 2),而B不是(3 4)

(apply #'(lambda (&rest x) (mapcar #'list x)) '(A B))

因为&rest x接受所有参数并将它们打包为一个列表,所以xvalue 也是如此(A B)。然后mapcar迭代两次,传递Alist,产生(A),然后对 . 执行相同的操作B。然后mapcar列出这些,产生( (A) (B) )

将打印语句放在那里以查看发生了什么很有用。

于 2013-01-08T21:35:08.750 回答