Set-car!, set-cdr! несвязанный в ракетку?
Я просто пытаюсь сделать очень простой код с set-car!
и set-cdr!
в racket
, но я получил ошибку: expand: unbound identifier in module in: set-car!
и expand: unbound identifier in module in: set-cdr!
Разве они не определены в racket
? Может ли кто-нибудь помочь?
Ответы
Ответ 1
Вам нужно импортировать mutable-pairs-6
, например:
(require rnrs/mutable-pairs-6)
Эти процедуры были перенесены в другой модуль и переименованы в mcons
, mcar
, mcdr
, set-mcar!
, set-mcdr!
, mlist
, чтобы подчеркнуть, что они работают с изменяемыми данными, в отличие от их неизменяемых аналогов.
Ответ 2
Ответ Óscar López верен, но не объясняет, почему обычные пары неизменны.
В Racket (и его предшественнике, PLT Scheme, начиная с версии 4), cons-блоки по умолчанию неизменяемы. Большинство программ Scheme никогда не нуждаются в модификации cons-ячеек, и их непреложность позволяет много оптимизировать. (Например, list?
и length
могут быть постоянными.)
В случаях, когда необходима изменчивость, есть mpair (как упоминалось) и более полезно, там есть коробки.
Ответ 3
В этой статье сообщается, почему они были удалены из Racket