你如何在 Racket 中创建一个空的可变列表?

How do you create an empty mutable list in Racket?

对于常规列表,您有很多选择,(list)null'() 都可以。但是如何构造一个空的 mutable 列表呢? The documentation 似乎没有提供任何 nullary 构造函数。

一旦你在 list creek 上没有不变性,为什么不全力以赴 milsts?一个优点是 'constructor' 语义可用于空的可变列表......以及一些用于处理可变列表的实用程序。

#lang racket
(require compatibility/mlist)
(define empty-mutable-list (mlist))

可能值得一提的是 '() 也是一个 mlist:

> (mlist? '())
#t

Racket manual中明确规定:

Similarly, a mutable list is not a list, except that the empty list is also the empty mutable list.

因此,用于构建空列表的相同运算符可用于构建空可变列表。

原因很简单:空列表是一种没有组件的特殊数据结构:所以,如果你没有组件,就没有什么可以改变的。因此,可变空列表是 与空列表相同的 对象。您只能用 set-mcar!set-mcdr! 改变可变对的汽车或 cdr,原因很简单,因为它们 是数据结构的 组件。

如果您只是想知道什么是可变专有列表的专有终止符,那么它与不可变专有列表相同。评估 '() 给出与评估 (mlist) 相同的答案,因此与不可变列表没有区别。

如果你想改变一个以零元素开头的列表,比如通过在前面添加一个元素来改变一个空列表,你不能这样做。空列表 () 是所有 Scheme 系统中的不可变单例。它是空列表的唯一表示。您有两种可能的解决方法:制作一个虚拟 mcons 来表示始终位于第一个元素之前的数据结构的头部,或者只是改变第一个元素的绑定。根据您将如何处理空结构上的操作,它们的用处会有所不同。