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

时间:2016-09-22 02:57:48

标签: list racket mutable

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

3 个答案:

答案 0 :(得分:2)

Racket manual中明确指出:

  

类似地,可变列表不是列表,除了空列表也是空的可变列表。

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

原因很简单:空列表是一个没有组件的特殊数据结构:因此,如果您没有组件,则没有任何可以变异的内容。因此,可变空列表是空列表的相同对象。您只能使用set-mcar!set-mcdr!变异汽车或可变对的cdr,原因很简单,因为它们数据结构的组件。

答案 1 :(得分:2)

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

如果您希望改变以零元素开头的列表,例如通过在前面添加元素来改变空列表,则无法执行此操作。空列表()是所有Scheme系统中的不可变单例。它是空列表的唯一表示。您有两种可能的解决方法:创建一个虚拟mcons来表示数据结构的头部,该头部始终位于第一个元素之前,或者只是改变第一个元素的绑定。根据您在空结构上处理操作的方式,它们的用途各不相同。

答案 2 :(得分:1)

一旦你没有不可变性的列表小溪,为什么不全押milsts?一个优点是有可用于空可变列表的'构造函数'语义......以及一些用于处理可变列表的实用程序。

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

值得一提的是,'()也是一个杀人主义者:

> (mlist? '())
#t