set-car !, set-cdr! несвязанный в ракетке? - PullRequest
16 голосов
/ 28 февраля 2012

Я просто пытаюсь сделать очень простой код с set-car! и set-cdr! в racket, но я получил ошибку: expand: unbound identifier in module in: set-car! и expand: unbound identifier in module in: set-cdr!

Разве они не определены в racket? Может ли кто-нибудь помочь?

Ответы [ 3 ]

24 голосов
/ 28 февраля 2012

Вам необходимо импортировать mutable-pairs-6, например:

(require rnrs/mutable-pairs-6)

Эти процедуры были перемещены в другой модуль и переименованы в mcons, mcar, mcdr, set-mcar!,set-mcdr!, mlist, чтобы подчеркнуть, что они работают с изменяемыми данными, в отличие от их неизменных аналогов.

12 голосов
/ 28 февраля 2012

Оскар Лопес ответил правильно, но не объясняет, почему нормальные пары неизменны.

В Racket (и его предшественнике, PLT Scheme, начиная с версии 4), cons-ячейки по умолчанию неизменны. Большинству программ Scheme никогда не требуется модифицировать cons-ячейки, и их неизменность позволяет проводить много оптимизаций. (Например, list? и length могут быть постоянными.)

Для случаев, когда требуется изменчивость, есть mpair (как уже упоминалось), а еще полезнее - ящики.

2 голосов
/ 23 июля 2012

В этой статье рассказывается, почему они были удалены из Ракетки

...