为什么Racket中的集合(或列表)打印#0#作为唯一的数据?

sup*_*dmo 6 set racket data-structures

我正在编写一个广泛使用集合的Racket程序.查看程序的输出,其中几个集合包括#0#作为他们唯一的数据.是什么造成的?

Lei*_*sen 5

#0#在Racket打印机中用于描述具有共享内存的循环数据结构或对象.基本上,它的工作方式是#0=,当你看到#0#引用该对象时,有一个对象被标记,比如说.

例如:

#0=(1 . #0#)
Run Code Online (Sandbox Code Playgroud)

是一个包含1s 的无限长度列表.这样做是因为创建的数据结构只是一个缺点,第一个项目是1,第二个项目指向自身.

您可以使用任意数量的这些来创建更复杂的图形结构.如:

#0=(#1=(1 . #0#) . #1#)
Run Code Online (Sandbox Code Playgroud)

最后,您根本不需要循环数据结构.可以说x是以下数据结构:

'(#0=#&42 . #0#)
Run Code Online (Sandbox Code Playgroud)

(wehre #&代表一个可变框),改变该对的第一个元素中的元素将另外改变该对的第二部分中的元素.因此,如果将此对设置为变量x,则:

> x
'(#0=#&42 . #0#)
> (set-box! (car x) 43)
> (car x)
'#&43
> (cdr x)
'#&43
> x
'(#0=#&43 . #0#)
Run Code Online (Sandbox Code Playgroud)

通常,您不能直接在代码中直接在代码中编写它,但可以使用它来构造它read.

> (define x (read)
#0=(1 . #0#)
> x
#0='(1 . #0#)
> (car x)
1
> (cadr x)
1
> (cdr x)
#0=1(1 . #0#)
Run Code Online (Sandbox Code Playgroud)

您还可以修改阅读器,以便read-accept-graph在阅读模块的源代码时直接将其放入代码中.