在lisp中嵌套数据列表上的'cdadr'

时间:2013-09-09 11:22:38

标签: lisp common-lisp

在研究conscdrcar以处理我尝试过的列表时:

(cadr '('(1) '(2)))
'(2)

按预期给出列表中的第二项。 以下给出:

(cdadr '('(1) '(2)))
((2))

如何使数据与代码协调一致并且仍然没有给出错误?

这是如何评估的?

cdr on'(2)应该给nil,这是。为什么不在上面?

[我是clisp和stackoverflow的新手,所以请原谅我。]

2 个答案:

答案 0 :(得分:8)

quote是一个特殊的运算符,它返回单个未评估的参数。表单(quote ...)可以使用'缩写为'...。由于'由读者处理,因此表格为

'('(1) '(2)))

实际上与

相同
(quote ((quote (1)) (quote (2)))

参数quote的最外层应用程序((quote (1)) (quote (2)))返回该参数。该参数的cadr是列表

(quote (2))

第一个元素是符号quote,第二个元素是单个元素2的列表。

答案 1 :(得分:2)

由于报价。你应该写(cadr '((1) (2)))

根据您的列表,(caadr '('(1) '(2)))会产生QUOTE

实际上,您的列表'('(1) '(2))确实是'((quote (1)) (quote (2))),这可能会更好地显示您获得此结果的原因。