来自'对lisp的简单介绍':
如果给出诸如#1 =(A B C。#1#)的循环列表作为输入,则LENGTH可以 根本不返回任何值。在大多数实现中,它将进入 无限循环。
这仍然是真的吗?是/是一个错误?为什么不首先检查列表的性质?
答案 0 :(得分:7)
在像R7RS Scheme和Common Lisp这样的现代实现中,它们确实标识了循环列表,但为了减少开销,CL可能会挂起length
并且list-length
如果检测到圆则返回nil。
当你看到的只是一次一个缺点时,没有简单的方法可以看到列表的性质。你所做的是迭代一个变量中的每一步,而第二个元素中的每两步盯着第二个元素。如果这两个是同一个对象,则有一个圆参考。这称为the turtle and hare algorithm。
答案 1 :(得分:4)
length
一般用于处理序列;圆形度问题与列表相关,但不适用于字符串或数组。 list-length
专门用于列表,并按正常列表的预期工作,但为循环列表返回nil
。