Common lisp 为什么公共Lisp REPL在插入此循环列表后保持无限运行?

Common lisp 为什么公共Lisp REPL在插入此循环列表后保持无限运行?,common-lisp,read-eval-print-loop,infinite,circular-list,Common Lisp,Read Eval Print Loop,Infinite,Circular List,我正在使用通用Lisp、SBCL和Slime。我不熟悉通用口齿不清 显然,这是Common Lisp中的循环列表: #1=('a 'b 'c . #1#) 这将提供一个无限的'a'b'c'a'b'c'a 当我把它放在REPL上时,它会一直运行: CL-USER> #1=('a 'b 'c . #1#) 为什么会这样?为什么REPL不返回它接收到的对象 如果我要求列表中的下一个元素,我可以理解无限行为。但是,我向REPL询问了对象本身的情况 我希望正确的列表或虚线列表会出现相同的行为:

我正在使用通用Lisp、SBCL和Slime。我不熟悉通用口齿不清

显然,这是Common Lisp中的循环列表:

#1=('a 'b 'c . #1#)
这将提供一个无限的'a'b'c'a'b'c'a

当我把它放在REPL上时,它会一直运行:

CL-USER> #1=('a 'b 'c . #1#)
为什么会这样?为什么REPL不返回它接收到的对象

如果我要求列表中的下一个元素,我可以理解无限行为。但是,我向REPL询问了对象本身的情况

我希望正确的列表或虚线列表会出现相同的行为:

CL-USER> (list 'a 'b 'c)
(A B C)

CL-USER> (cons 'a  (cons 'b 'c))
(A B . C)
想一想打印这样一个对象涉及到什么:一个幼稚的打印机打印它需要多长时间,输出有多大

好的,CL让你适应了这一点:有许多打印机控制变量,其中最有用的可能就是打印循环。您可以将其设置为true,以启用打印机中的圆度检测。如果你这样做了,你可能也会意识到为什么默认为零

如果我要求列表中的下一个元素,我可以理解无限行为

(cdr list)
为什么??下一个元素不是计算时间无限的操作。它只是获取下一个元素,这只是一个简单的操作。它只是循环列表中的下一个元素

无限是指当一个人请求循环中的下一个元素时,检查列表的末尾

(cdr list)
vs


打印结果的Read-Eval-Print循环中的打印机可能会在打印无限列表的元素时执行类似的操作。TFB提到,需要进行特殊检查以检测循环性,以保持计算有界。

另外注意,通常不需要在引用的列表中引用符号。