gpt4 book ai didi

支持套车方案!并设置-CDR!在sicp中

转载 作者:行者123 更新时间:2023-12-02 06:30:18 25 4
gpt4 key购买 nike

我正在阅读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! 在 Racket 中被报告为无界。

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

原版全书搜索:

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! unbound in racket?

(require rnrs/mutable-pairs-6)

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

最佳答案

请记住,Racket 支持多种语言。在 #langracket 中,对是不可变的,这意味着修改器 set-car!set-cdr! 不存在。如果您想使用#langracket,您可以使用框列表。一个盒子可以保存一个值,你可以使用 set-box! 来更改盒子保存的值。或者,您可以使用使用 mconsmlist 构建的可变对(和可变列表),但结果可能会有点麻烦。

#lang r5rs#lang sicp 中的对是可变的,这意味着您可以按原样使用 SICP 代码。

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

如果您想知道为什么对在 #langracket 中是不可变的,请参阅: https://blog.racket-lang.org/2007/11/getting-rid-of-set-car-and-set-cdr.html

关于支持套车方案!并设置-CDR!在sicp中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59679811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com