Functional programming 球拍中有参考类型吗?

Functional programming 球拍中有参考类型吗?,functional-programming,racket,Functional Programming,Racket,我想在racket中实现一个双链接列表。开始时,我编写了一个简单的两节点列表来测试racket中的引用。这是我的密码: #朗球拍 (结构节点(val next)#:透明#:可变) (定义n0(节点0为空)) (定义n1(节点1 n0)) n0 n1 (下一步设置节点!n0 n1) n0 n1 以下是相应的输出: (node 0 '()) (node 1 (node 0 '())) #0=(node 0 (node 1 #0#)) #0=(node 1 (node 0 #0#)) 输出的第一行

我想在racket中实现一个双链接列表。开始时,我编写了一个简单的两节点列表来测试racket中的引用。这是我的密码:

#朗球拍
(结构节点(val next)#:透明#:可变)
(定义n0(节点0为空))
(定义n1(节点1 n0))
n0
n1
(下一步设置节点!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能够打印回引用的一种方式。你可以在中更多地了解它,但简而言之,当你看到
#0=
时,它说
#0#
指的是这个结构,因此如果你看到它,那就是后面的引用(可以说)所在的位置。

关于它们是引用,你是正确的。在Racket中,几乎所有类型(除了整数和其他编译器优化,我将不在这里介绍)都引用存储在堆中的对象。因此,当您调用
set node next时,您告诉Racket将结构
next
字段指向原始结构。基本上形成一个循环:


#0=
符号是Racket能够打印回引用的一种方式。你可以在中更多地了解它,但简言之,当你看到
#0=
时,它说
#0#
指的是这个结构,因此如果你看到它,那就是后面的参考(可以说)所在。

我感谢你的回答。我还有一个问题。当球拍使用参考而不是整个结构时,
下一步设置节点?抱歉,我不理解您的问题。例如,如果我这样定义n0
(定义n0(节点0 null))
,然后
(下一步设置节点!n0(节点1 null))
,结果将是
(节点0(节点1’())
。下一步它为什么不将引用存储在n0中?我感谢您的回答。我还有一个问题。当球拍使用参考而不是整个结构时,
下一步设置节点?抱歉,我不理解您的问题。例如,如果我这样定义n0
(定义n0(节点0 null))
,然后
(下一步设置节点!n0(节点1 null))
,结果将是
(节点0(节点1’())
。下一步它为什么不在n0中存储引用?