Dr.Racket中的哪个lang包适合SICP?

我正在尝试与SICP,我有一些代码。 所以我开始:

#lang scheme (word 'comp 'uter) 

返回错误:函数(字)未定义。

即使我试图将其复制到IDE(运行):

 (define word? (let ((number? number?) (symbol? symbol?) (string? string?)) (lambda (x) (or (symbol? x) (number? x) (string? x))))) 

还是一样。

我认为这可能是语言版本或其他问题。


以上是来自“Simply Scheme”,当我在SICP中准确地引入代码时:

 (define (sqrt x) (sqrt-iter 1.0 x)) 

IDE未定义返回sqrt-iter 。 代码可以在第一章中find: http : //mitpress.mit.edu/sicp/code/index.html

在DrRacket中有一个SICP兼容性语言

1.从包pipe理器

在文档中有一个从DrRacket安装的简单指南:

  1. 打开软件包pipe理器:在DrRacket中select菜单“文件”,然后select“软件包pipe理器…”。

  2. 在“我的意思”选项卡中find文本字段并input:“sicp”

  3. 点击“安装”button。 这会产生大量的输出。 即使有警告,也不要担心。

  4. testing它。 确保DrRacket在左下angular有“确定源语言”。 编写下面的程序,然后单击运行

     #lang sicp (inc 42) ; ==> 43 

以下是使用图片语言的更高级的testing,它需要包含在#%require

 #lang sicp (#%require sicp-pict) (paint-hires (below (beside diagonal-shading (rotate90 diagonal-shading)) (beside (rotate270 diagonal-shading) (rotate180 diagonal-shading)))) 

单击“ 运行” ,您应该在交互窗口中看到一个正方形,朝向中心变亮。

2命令行安装

或者,也可以通过运行以下命令从terminal/shell执行步骤1-3:

 raco pkg install sicp 

从这里开始,执行第一个安装说明中的第4步来testing它。

3.旧版本或DrRacket使用星球,如果raco pkg不工作

在DrRacket中还有一个旧版本的SICP兼容性语言 。 在“确定来自源语言”的左下angularselect框中,您可以添加:

 #lang planet neil/sicp 

作为定义(顶部文本区域)中的唯一一行,然后按下RUN键并将其安装。 重新启动DrRacket,你会发现它在语言下拉列表中可用。 祝你好运。 你可能会得到很多红色的错误信息。 只要忽略它,重新启动DrRacket。 您可能无法再在语言菜单中findselect,但是通过使用#lang planet neil/sicp启动每个文件,仍然可以作为模块语言。

从错误判断,这似乎与图片语言模块有关。 我testing了这个sniplet,它仍然工作:

 (paint-hires (below (beside diagonal-shading (rotate90 diagonal-shading)) (beside (rotate270 diagonal-shading) (rotate180 diagonal-shading)))) 

Sylwester的回答是我想要的。 不过,我注意到Racket 6.5 增加了对SICP的直接支持 。 我想人们可能想知道这一点。

现在可以在添加SICP支持之后在Racket中编写如下代码:

 #lang sicp (#%require sicp-pict) (paint einstein) 

[好的开始; 继续,你会享受计划!]

在计划中,程序是在一个环境中开发的。 环境定义了从标识符到值的映射。 一些值是函数,一些是数字等。当你定义一个函数:

 (define (sqrt x) (sqrt-iter 1.0 x)) 

标识符x被绑定为sqrt的参数,值1.0是一个数字,标识符sqrt-iter来自环境。

有一个问题要问自己:“ sqrt-iter在哪里定义的,它是什么? 由于它不是由您定义的, sqrt-iter必须来自您的计划内置的环境或input到您的计划中。 您没有导入任何东西,并且Scheme中没有定义sqrt-iter (请参阅R5RS或其他资源)。 因此sqrt-iter是不受约束的。

同样的逻辑适用于每一个标识符,包括你使用的word

在你的执行word? 使用语法关键字let来引入新的绑定标识符。 当你写(number? number?)你引入一个新的标识number? (在左边)并绑定到number? (右)来自环境(在Scheme中定义)。 使用let这不是真的买你什么。 你的代码为word? 可以实现为:

 (define (word? x) (or (symbol? x) (number? x) (string? x))) ;; number?