球拍中有参考类型吗?
Posted
技术标签:
【中文标题】球拍中有参考类型吗?【英文标题】:Is there any reference type in racket? 【发布时间】:2021-07-30 15:44:22 【问题描述】:我想在球拍中实现一个双向链表。一开始我写了一个简单的两个节点列表来测试球拍中的引用。这是我的代码:
#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#))
输出的第一行和第二行是我对代码的期望,但在那之后我不知道它在做什么。我猜那些 # 与参考有关,但我在网上找不到任何东西。谁能帮我解释一下这个输出?
谢谢。
【问题讨论】:
【参考方案1】:你是正确的他们是参考。在 Racket 中,几乎所有类型(除了整数和其他我不会在这里讨论的编译器优化)都引用存储在某种堆中的对象。因此,当您调用set-node-next!
时,您告诉Racket 将结构next
字段指向原始结构。基本形成一个循环:
#0=
表示法是 Racket 能够打印出反向引用的一种方式。您可以在 the docs 中了解更多信息,但简而言之,当您看到 #0=
时,它会说 #0#
指的是 this 结构,因此如果您看到它,那就是反向引用(可以这么说)是。
【讨论】:
感谢您的回答。我有另一个问题。当调用set-node-next!
时球拍使用引用而不是整个结构?
对不起,我不明白你的问题。
例如,如果我这样定义 n0 (define n0 (node 0 null))
然后 (set-node-next! n0 (node 1 null))
,结果将是 (node 0 (node 1 '()))
。为什么它没有将引用存储在 n0-next 中?以上是关于球拍中有参考类型吗?的主要内容,如果未能解决你的问题,请参考以下文章