支持set-car的方案!并设置-cdr!在 scp

Alg*_*bra 3 scheme sicp org-mode racket mit-scheme

我正在阅读SICP 4.1.3 Evaluator Data Structures

(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))))
Run Code Online (Sandbox Code Playgroud)

然而,set-car!据报道,球拍是无界的。

然后尝试了“GNU Guile 2.2.6”的实现,“GNU mit-scheme 10.1.10”,不幸的set-car!是,都没有绑定。

搜索原版全书:

find . -type f -iname "*.org"  -exec grep --color -nH --null -e "set-car!" \{\} + |wc -l
27 
Run Code Online (Sandbox Code Playgroud)

在第 3、4 和 5 章中出现了 27 次,
在第 3 章中我更改了 setcar!到 elisp 的 setcar。但是对于元语言抽象的第 4 章,elisp 不是一个好的选择。

第 4 章有点困难,因此现在有冒险的风险。

我找到了很好的解决方案set-car!, set-cdr! 无拘无束的球拍?

(require rnrs/mutable-pairs-6)
Run Code Online (Sandbox Code Playgroud)

作为解决方案,如果替换set-car! set-cdr!set-mcar! set-mcdr,第 4 章和第 5 章的代码将通过球拍实现顺利运行?

soe*_*ard 6

请记住,Racket 支持多种语言。在#lang racket对是不可变的,这意味着存取器set-car!set-cdr!不存在。如果您想使用,#lang racket您可以使用框列表。一个框可以容纳一个值,您可以使用它set-box!来更改框所容纳的值。或者,您可以使用由mconsand构建的可变对(和可变列表)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