32

我正在通过 SICP 工作。目前,在第一章中,我无法让 Racket 让我重新定义“原始”。例如,我的印象是我应该能够任意做(define + 5),那很好,或者重新定义sqrt程序。相反,我得到了这个:

define-values: cannot change constant variable: +

我目前将语言设置为 R5RS,我的印象是它会处理与 SICP 的兼容性问题。

4

3 回答 3

34

即使可能,在没有真正了解系统将如何对此做出反应的情况下,您也不应该进行此类重新定义。例如,如果您重新定义+,其他代码会中断吗?在 Racket 的情况下,答案是“否”——但这是因为你并没有真正重新定义+: 相反,你定义了一个只有你的代码可以使用的new 。 +

至于语言选择——Rackets R5RS 模式是一种非常严格的模式,通常不是你想要使用的。要获得对SICP更加友好的环境,请参阅 Neil Van Dyke 的SICP 支持页面,该页面将为您提供专为本书设计的语言。(IIRC,它甚至具有书籍展示的图形语言。)

于 2010-08-30T05:34:22.197 回答
20

我在这里尝试通过 RSA 示例工作时遇到了问题(SICP 内容的一部分): http ://mitpress.mit.edu/sicp/psets/ps3/readme.html

为了使它工作,我必须这样做:

1)通过将其添加到空白文件的顶部来运行初始下载:

#lang planet neil/sicp

然后点击“运行”

2) 去喝杯咖啡,享受 DrRacket 非常用户友好的自动下载和安装 PLaneT Neil 模块 ;-)

3)然后一旦安装,关闭 DrRacket。

4) 重新打开,然后从选择语言列表中选择 SICP PLaneT 1.15。
(除了执行初始下载之外,我无法在顶部添加声明来为我工作。)

祝你好运!

于 2011-05-18T01:18:16.403 回答
11

在语言面板中,您需要禁用“不允许重新定义初始绑定”。这解决了这个问题。

于 2010-08-30T04:32:33.687 回答