在Scheme中,使用list
定义列表可确保结果是正确的列表,这意味着其最终元素是列表()
。
如果定义了一个测试列表:
(define test (list 27 3))
并取列表的length
,Racket说它是2。当一个prints
列表时,它仅显示(27 3)
,而不显示()
。
但是,如果有人拿(rest (rest test))
,则会出现()
。执行(list-ref test 2)
会产生错误。
如果()
遍历元素时,cdr
在列表中显示为第3个元素,为什么不将其视为列表的成员?
这会不会在Scheme中的正确列表和不正确列表之间造成混淆?
答案 0 :(得分:2)
列表是成对的链。元素是每对的car
,每对的cdr
是对链中下一对的引用。
正确列表的最后一对cdr
是对特殊()
对象的引用,该对象代表一个空列表。它不是列表中的元素,因为它位于cdr
中,而不是car
中。
rest
函数返回一对cdr
。因此(rest (rest test))
返回第二个cdr
,即()
,因为它位于列表的末尾。
没有不正确列表的混乱。不正确的列表具有()
以外的其他内容作为链中最后一对货币对的cdr
。