球拍中有参考类型吗?

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 中?

以上是关于球拍中有参考类型吗?的主要内容,如果未能解决你的问题,请参考以下文章

12月份乒乓球赛事王楚钦参加吗

如何在球拍中有多个返回值?

球拍中的“匹配”可以有来自外部范围的变量模式吗?

小阴谋家和球拍

类型化球拍优化器

C#中有函数类型吗?