набор-автомобиль !, набор-cdr! развязался в рэкет?

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

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


person SoftTimur    schedule 28.02.2012    source источник
comment
Какой язык вы выбираете? Установите язык R5RS.   -  person PJ.Hades    schedule 28.02.2012
comment
У меня в начале стоит #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>)   -  person SoftTimur    schedule 28.02.2012
comment
Используйте #lang r5rs -- нижний регистр. (Но использование языка r5rs не доставит вам удовольствия.)   -  person Eli Barzilay    schedule 28.02.2012


Ответы (2)


Вам нужно импортировать mutable-pairs-6, например:

(require rnrs/mutable-pairs-6)

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

person Óscar López    schedule 28.02.2012
comment
Спасибо за ваш комментарий... как насчет cadr? кажется, что mcadr не существует... - person SoftTimur; 28.02.2012
comment
К сожалению, этих процедур (mcadr, mcdar и т. д.) не существует, вам придется реализовать их функциональность вручную. - person Óscar López; 28.02.2012
comment
Определите это сами! (define mcadr (compose mcar mcdr)) - person Chris Jester-Young; 28.02.2012
comment
Каким-то образом, хотя я require этот модуль, он все еще говорит мне set-cdr!: unbound identifier in module. Может быть, их уже нет? - person Zelphir Kaltstahl; 16.06.2017
comment
В этом пакете нет mlist. Поэтому, чтобы использовать его, нам также нужно добавить (require compatibility/mlist) - person Aliaksandr Sushkevich; 21.10.2018

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

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

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

person Chris Jester-Young    schedule 28.02.2012
comment
Обязательная ссылка здесь. - person Eli Barzilay; 28.02.2012
comment
В главах 4 и 5 SICP используются изменяемые cons-ячейки для метациклического оценщика и регистрационных машин, поэтому код из книги (mitpress.mit.edu/sites/default/files/sicp/code/index.html) не совсем работает "из коробки" на Ракетка v7.2. - person Reb.Cabin; 17.03.2019
comment
Вы можете использовать пакет neil/sicp с ракеткой, чтобы получить set-car! и установить-cdr! для СИКП. Я делаю это прямо сейчас, и, похоже, это работает. Примерно так в командной строке работает: `racket -i -p dyoo/simply-scheme -p neil/sicp -l xrepl` - см. planet.racket-lang.org/package-source/neil/sicp.plt/1/18 / - person Matthieu; 18.09.2020