为什么这个表达式在Common Lisp中不能正常工作?

为什么这个表达式在Common Lisp中不能正常工作?,lisp,common-lisp,apply,Lisp,Common Lisp,Apply,口齿不清的新手。我知道 (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) 正如所料。发

口齿不清的新手。我知道

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

正如所料。发生了什么事?

简化它。假设您使用
A
而不是
(12)
,使用
B
而不是
(34)

因为
&rest x
接受所有参数并将它们打包为一个列表,所以
x
具有该值
(A B)
。 然后
mapcar
迭代两次,将
A
传递到
列表
,生成
(A)
,然后对
B
执行相同的操作。然后
mapcar
列出这些,生成
((a)(B))


把打印的语句放在那里,看看发生了什么,这很有用。

Ah!好吧,我的误解是&休息。非常感谢。
(apply #'(lambda (&rest x) (mapcar #'list x)) '(A B))