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安装的简单指南:
-
打开软件包pipe理器:在DrRacket中select菜单“文件”,然后select“软件包pipe理器…”。
-
在“我的意思”选项卡中find文本字段并input:“sicp”
-
点击“安装”button。 这会产生大量的输出。 即使有警告,也不要担心。
-
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?