2013-01-08 71 views
3

Lisp的新手。我知道为什么此表达式在Common 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) 

预期。到底是怎么回事?

回答

3

简化它。假设你使用A代替(1 2),并且B代替(3 4)

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

因为&rest x通吃的论点,并打包起来作为一个列表,所以x具有价值 (A B)。 然后mapcar重复两次,通过Alist,产生(A),然后它与B一样。然后mapcar列出那些,生成((A) (B))

将print语句放在那里以查看发生了什么是有用的。

+0

啊!好吧,我的误解是休息。谢谢! – user1959408

相关问题