我认为列表的自然定义是列表是:
- 空列表,
()
;
- 或者一对,其 car 是任何对象,其 cdr 是一个列表。
请注意,循环列表不符合此标准,类似(x . y)
or之类的也不符合(x y . z)
。
我相信这是 R n RS 对至少某些 n 值使用的“列表”的定义(特别是R5RS使用的定义)。同样,R5RS 很清楚,它list?
必须为循环列表返回 false(因此特别是它必须具有发生检查或类似的东西)。
历史上其他 Lisp 对此要宽松得多:例如 Common Lisp 定义它listp
只是检查一个对象是不是()
或者是一个缺点,并将列表定义为该类型的元素。什么 Scheme 称之为“列表” Common Lisp 称之为“正确的列表”。
这是一个list?
使用龟兔赛跑算法来检查循环性的版本(这可能不正确,我认为即使是这样也过于复杂,但为时已晚):
(define (lyst? l)
(cond
[(null? l)
#t]
[(not (cons? l))
#f]
[else
(let lyst-loop? ([tortoise l]
[hare (cdr l)])
(cond [(eq? hare tortoise)
#f]
[(null? hare)
#t]
[(cons? hare)
(cond [(null? (cdr hare))
#t]
[(not (cons? (cdr hare)))
#f]
[else
(lyst-loop? (cdr tortoise)
(cdr (cdr hare)))])]
[else
#f]))]))