Dret博士对SICP的问题

时间:2010-08-30 03:58:45

标签: lisp scheme racket sicp

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

define-values: cannot change constant variable: +

我目前使用的语言设置为R5RS,我认为这样可以解决与SICP的兼容性问题。

3 个答案:

答案 0 :(得分:35)

即使可能,如果没有真正理解系统对此的反应,这种重新定义也不是你应该做的事情。例如,如果您重新定义+,其他代码是否会中断?在Racket的案例中,答案就是“不” - 但这是因为你没有真正重新定义+:相反,你定义了一个 new +,只有你的代码才能使用。

至于语言选择 - 球拍R5RS模式是非常严格的,并不是你通常想要使用的。对于很多更适合SICP的环境,请参阅Neil Van Dyke的SICP Support page,它将为您提供专门为本书制作的语言。 (IIRC,它甚至还有图书显示的图形语言。)

答案 1 :(得分:20)

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

要实现这一目标,我必须这样做:

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

#lang planet neil/sicp

然后点击“Run”

2)享受DrRacket非常人性化的自动下载,并通过去喝咖啡来安装PLaneT Neil模块; - )

3)然后安装完毕后,关闭DrRacket。

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

祝你好运!

答案 2 :(得分:11)

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

相关问题