为什么这个表达式在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))