scheme - 支持套车的方案!和设置-cdr!在 scp
问题描述
我正在阅读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))))
但是,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
在第 3 章第 4 和第 5 章中出现了 27 次,
在第 3 章中我更改了 setcar!到 elisp 的 setcar。但是对于元语言抽象的第 4 章来说,elisp 并不是一个好的选择。
第 4 章有点困难,因此现在有冒险的风险。
我找到了很好的解决方案set-car!, set-cdr! 在球拍中不受约束?
(require rnrs/mutable-pairs-6)
作为解决方案,如果替换set-car!
set-cdr!
为set-mcar!
set-mcdr
,第 4 章和第 5 章的代码将通过球拍实现顺利运行?
解决方案
请记住,Racket 支持多种语言。Inpairs#lang racket
是不可变的,这意味着 mutatorsset-car!
和set-cdr!
不存在。如果您想使用#lang racket
,您可以使用框列表。一个盒子可以保存一个值,您可以使用它set-box!
来更改盒子保存的值。mcons
或者,您使用用and构建的可变对(和可变列表)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
推荐阅读
- css - 在视频的左侧和右侧添加填充
- typescript - 为什么打字稿不会在原型函数中推断“this”的类型?
- java - 放心和弹簧 - 第一次测试后价值变为空
- ruby-on-rails - 在 Rails 中为数据库视图创建子记录时出现问题
- uima - 如何在 RUTA 中选择和设置覆盖/覆盖注释作为特征
- vba - 取消保护文档、运行子程序和保护文档时出现 VBA 错误(带有 if/thens 的范围似乎不起作用,但基本 if then 工作)
- reactjs - 为什么 reactDom 不应用 Twig 文件
- angular - 如何在角度模板中迭代联合类型数组
- html - .css 中定义的类背景未显示在网页上。无法识别图像的路径。为什么?
- javascript - 木偶怪的行为