【问题标题】: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#))

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

谢谢。

【问题讨论】:

    标签: functional-programming racket


    【解决方案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 中?
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 2017-06-10
    • 2019-04-16
    • 2016-10-20
    • 2016-02-24
    • 1970-01-01
    • 2012-04-23
    • 2014-01-22
    相关资源
    最近更新 更多