set-car !, set-cdr!球拍没有束缚?

Sof*_*mur 17 scheme racket

我只是想与做的非常简单的代码set-car!,并set-cdr!racket,但我得到了错误:expand: unbound identifier in module in: set-car!expand: unbound identifier in module in: set-cdr!

它们不是定义的racket吗?有人可以帮忙吗?

Ósc*_*pez 26

您需要导入mutable-pairs-6,如下所示:

(require rnrs/mutable-pairs-6)
Run Code Online (Sandbox Code Playgroud)

这些程序被转移到一个不同的模块,并更名为mcons,mcar,mcdr,set-mcar!,set-mcdr!,mlist以强调它们对可变数据进行操作,不像他们的不可变.

  • 自己定义!`(定义mcadr(compose mcar mcdr))` (3认同)
  • 这个包中没有`mlist`.所以要使用它我们还需要添加`(require compatibility/mlist)` (3认同)

Chr*_*ung 12

ÓscarLópez的回答是正确的,但并没有解释为什么正常的对是不可改变的.

在Racket(及其前身,PLT Scheme,从版本4开始)中,cons单元默认是不可变的.大多数Scheme程序永远不需要修改cons单元,并且使它们不可变允许许多优化.(例如,list?并且length都可以是恒定时间.)

对于需要可变性的情况,有mpair(如上所述),更有用的是,有盒子.

  • [此处有必要参考.](http://blog.racket-lang.org/2007/11/getting-rid-of-set-car-and-set-cdr.html) (7认同)