【问题标题】:set-car!, set-cdr! unbound in racket?设置汽车!,设置 CDR!在球拍中不受约束?
【发布时间】:2012-03-17 12:52:54
【问题描述】:

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

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

【问题讨论】:

  • 您选择哪种语言?将语言设置为 R5RS。
  • 我一开始有#lang racket,当我设置#lang R5RS时,它给了我一个错误:Module Language: invalid module text standard-module-name-resolver: collection not found: #<path:R5RS/lang> in any of: (#<path:/home/chengtie/.racket/5.1.1/collects> #<path:/usr/share/racket/collects>)
  • 使用#lang r5rs -- 小写。 (但使用 r5rs 语言不会带来愉快的体验。)

标签: scheme racket


【解决方案1】:

你需要导入mutable-pairs-6,像这样:

(require rnrs/mutable-pairs-6)

这些过程被移到不同的模块并重命名为mconsmcarmcdrset-mcar!set-mcdr!mlist,以强调它们对可变数据进行操作,而不像它们的不可变对应物.

【讨论】:

  • 感谢您的评论...cadr 呢?看来mcadr 不存在...
  • 遗憾的是这些程序(mcadrmcdar 等)不存在,您必须手动实现它们的功能
  • 自己定义! (define mcadr (compose mcar mcdr))
  • 不知何故,尽管我 require 那个模块,它仍然告诉我 set-cdr!: unbound identifier in module。难道他们已经不在了?
  • 这个包中没有mlist。所以要使用它我们还需要添加(require compatibility/mlist)
【解决方案2】:

Óscar López 的回答是正确的,但没有解释为什么正常对是不可变的。

在 Racket(及其前身 PLT Scheme,自第 4 版起)中,cons 单元默认情况下是不可变的。大多数 Scheme 程序从不需要修改 cons 单元格,并且让它们是不可变的可以进行许多优化。 (例如,list?length 都可以是常数时间。)

对于需要可变性的情况,有 mpair(如前所述),更有用的是,还有 box。

【讨论】:

猜你喜欢
  • 2021-12-21
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多