Схема, которая поддерживает set-car! и установить-CDR! в сикп - PullRequest
3 голосов
/ 10 января 2020

Я читаю SICP 4.1.3 Структуры данных оценщика

(define (make-frame variables values)
  (cons variables values))
(define (frame-variables frame) (car frame))
(define (frame-values frame) (cdr frame))
(define (add-binding-to-frame! var val frame)
  (set-car! frame (cons var (car frame)))
  (set-cdr! frame (cons val (cdr frame))))

Тем не менее, set-car! сообщается как неограниченный в ракетке.

Затем опробовал навесное оборудование «GNU Guile 2.2.6», «GNU mit-схема 10.1.10», к сожалению, set-car! все не связаны.

Поиск по всей книге оригинальной версии:

find . -type f -iname "*.org"  -exec grep --color -nH --null -e "set-car!" \{\} + |wc -l
27 

В главе 3 4 и 5 есть 27 случаев,
и в главе 3 я меняю setcar! установить машину Элисп. но elisp не является хорошим вариантом для главы 4 металингвистики c абстракция.

Глава 4 немного сложна, поэтому теперь риск приключений.

Я нашел хорошее решение set-car !, set-cdr! unbound in racket?

(require rnrs/mutable-pairs-6)

Как решение: если заменить set-car! set-cdr! на set-mcar! set-mcdr, коды глав 4 и 5 будут работать без проблем при реализации ракетки?

1 Ответ

6 голосов
/ 10 января 2020

Помните, что Racket поддерживает несколько языков. В #lang racket пары неизменны, что означает, что мутаторы set-car! и set-cdr! отсутствуют. Если вы хотите использовать #lang racket, вы можете работать со списком ящиков. Ящик может содержать одно значение, и вы можете использовать set-box!, чтобы изменить значение, хранящееся в ящике. В качестве альтернативы вы можете использовать изменяемые пары (и изменяемые списки), созданные с mcons и mlist, но это может оказаться немного громоздким.

Пары в #lang r5rs или #lang sicp являются изменяемыми, что означает, Вы можете использовать код SICP как есть.

https://docs.racket-lang.org/sicp-manual/SICP_Language.html?q=sicp

Если вам интересно, почему пары неизменны в #lang racket, см .: https://blog.racket-lang.org/2007/11/getting-rid-of-set-car-and-set-cdr.html

...