球拍中有参考类型吗?

Is there any reference type in racket?

我想在racket中实现一个双向链表。一开始我写了一个简单的两个节点列表来测试球拍中的引用。这是我的代码:

#lang racket

(struct node (val next) #:transparent #:mutable)

(define n0 (node 0 null))
(define n1 (node 1 n0))
n0
n1
(set-node-next! n0 n1)
n0
n1

这是相应的输出:

(node 0 '())
(node 1 (node 0 '()))
#0=(node 0 (node 1 #0#))
#0=(node 1 (node 0 #0#))

输出的第一行和第二行是我对代码的预期,但在那之后我不知道它在做什么。我猜那些 # 与参考有关,但我在网上找不到任何东西。任何人都可以为我解释这个输出吗?

谢谢。

你说的是参考是正确的。在 Racket 中,几乎所有类型(整数和其他我不会在这里讨论的编译器优化除外)都指的是存储在某种堆中的对象。因此,当您调用 set-node-next! 时,您告诉 Racket 将结构 next 字段指向原始结构。基本形成一个循环:

#0= 符号是 Racket 能够打印出反向引用的一种方式。您可以在 the docs 中了解更多信息,但简而言之,当您看到 #0= 时,它表示 #0# 指的是 this 结构,并且因此,如果您看到它,那就是反向引用(可以这么说)所在的位置。