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

时间:2013-01-08 20:59:46

标签: lisp common-lisp apply

Lisp的新手。我知道

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

将给出

'((1 3) (2 4))

根据我对申请如何运作的理解,我希望

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

将print语句放在那里以查看正在发生的事情是很有用的。