Подтвердить что ты не робот

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? Может ли кто-нибудь помочь?

4b9b3361

Ответ 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 (как упоминалось) и более полезно, там есть коробки.