在Scheme中列出一个列表

在Scheme中列出一个列表,scheme,imperative-programming,Scheme,Imperative Programming,我试图在Scheme中创建一个类似数组的数据结构,因为我需要经常引用(并修改!),所以我想给它起个名字。但从我在各个教程网站上读到的内容来看,命名列表供以后参考的唯一方法似乎是使用define。那就好了,只是看起来一旦我用define初始化一个列表,修改或添加到所述列表中就会变得更加复杂。例如,似乎我不能只做(追加单词列表(元素)),我需要某种方式的修改!砰 基本上,我的问题归结为:define是我命名列表的唯一希望吗?如果是这样的话,我是否被困在了改变元素的铁环中?谢谢。(追加单词列表(元素)

我试图在Scheme中创建一个类似数组的数据结构,因为我需要经常引用(并修改!),所以我想给它起个名字。但从我在各个教程网站上读到的内容来看,命名列表供以后参考的唯一方法似乎是使用
define
。那就好了,只是看起来一旦我用
define
初始化一个列表,修改或添加到所述列表中就会变得更加复杂。例如,似乎我不能只做
(追加单词列表(元素))
,我需要某种方式的修改!砰


基本上,我的问题归结为:
define
是我命名列表的唯一希望吗?如果是这样的话,我是否被困在了改变元素的铁环中?谢谢。

(追加单词列表(元素))
正在创建一个新列表。您可能需要使用
set
重定向对新列表的引用,或
定义
使用相同符号名称对新列表的引用。

是的,
定义
是在Scheme中命名事物的方式。Scheme中的普通列表不允许您更改其元素,因为它是不可变的—这是在使用功能数据结构时您必须学会处理的事情之一。当然,您可以向其中添加元素或删除元素,但这些操作将生成新的列表,您不能在适当的位置更改元素


另一种选择是使用可变列表而不是普通列表,但如果您只是在学习使用Scheme,那么最好先坚持使用不可变列表,并学习Scheme方法来处理不可变数据。

是的,定义是Scheme中执行“赋值”(真正命名)的方法。但是,如果你正在编写某种包,你可以考虑把整个东西包在一个函数内,然后用“让”来定义你所指的东西。 然后,当然,您必须有某种抽象来展开“包”中的函数

参见SICP 2.5具有通用操作的建筑系统


AFAIK,方案列表不是一成不变的。有一些命令可以改变它们的元素。好的,谢谢你的帮助。我想如果我在前面而不是后面添加新的元素,我可以使事情更容易进行…@AmberWolfe,没错!单链表的前面是添加元素最容易的地方,也是最有效的地方。使用
cons
在前面添加,不要忘记它会创建一个新列表,它不会修改原始列表,您需要存储它again@Vincent默认情况下,Racket的列表是不可变的。从列表中间删除元素的最佳方法是什么?如果我需要修改一个元素,我假设我必须删除它,然后添加一个带有修改的新元素。