球拍中有参考类型吗?
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 结构,并且因此,如果您看到它,那就是反向引用(可以这么说)所在的位置。
我想在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 结构,并且因此,如果您看到它,那就是反向引用(可以这么说)所在的位置。