我正在尝试使用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)))))
还是一样。
我认为语言版本可能存在某些问题。或者
以上来自“简单方案”,当我在SICP中完全介绍代码时:
(define (sqrt x)
(sqrt-iter 1.0 x))
IDE返回sqrt-iter
未定义。代码可以在第一章找到:http://mitpress.mit.edu/sicp/code/index.html
答案 0 :(得分:34)
在DrRacket中有一个SICP compatibility language
在documentation中,有一个简单的指南,介绍如何从DrRacket安装它:
打开包管理器:在DrRacket中选择菜单“文件”,然后选择“包管理器......”。
在“Do Do I Mean”选项卡中找到文本字段并输入:“sicp”
单击“安装”按钮。这会产生大量的输出。即使有警告,也不要担心。
测试一下。确保DrRacket具有“从源中确定语言” 左下角。编写以下程序并单击 RUN :
#lang sicp
(inc 42)
; ==> 43
这是一个使用图片语言的更高级测试,需要包含在#%require
中:
#lang sicp
(#%require sicp-pict)
;; paint-hires / paint-hi-res renamed to just paint
(paint (below (beside diagonal-shading
(rotate90 diagonal-shading))
(beside (rotate270 diagonal-shading)
(rotate180 diagonal-shading))))
单击 RUN ,您会在交互窗口中看到一个朝向中心更亮的方块。
或者,您也可以通过运行以下命令从终端/ shell执行步骤1-3:
raco pkg install sicp
从这里开始,在第一个安装说明中执行步骤4.进行测试。
raco pkg
不起作用在DrRacket中还有一个old version of SICP compatibility language。虽然左下角的选择框位于“从源确定语言”,但您可以添加:
#lang planet neil/sicp
作为定义中的唯一一行(顶部文本区域)并按 RUN ,它将被安装。重新启动DrRacket,您将在语言下拉菜单中找到它。祝好运。
您可能会收到许多红色的错误消息。只需忽略它并重新启动DrRacket。您可能无法在语言菜单中找到该选项,但通过使用#lang planet neil/sicp
启动每个文件,它仍可用作模块语言。
从错误来看,它似乎与图片语言模块有关。我测试了这个片段,它仍然有效:
(paint-hires (below (beside diagonal-shading
(rotate90 diagonal-shading))
(beside (rotate270 diagonal-shading)
(rotate180 diagonal-shading))))
答案 1 :(得分:15)
Sylwester's answer是我想要的。但是,我注意到Racket 6.5有added direct support for SICP。我想人们可能想知道这一点。
现在,在添加SICP支持后,可以在Racket中编写如下代码:
#lang sicp
(#%require sicp-pict)
(paint einstein)
答案 2 :(得分:4)
[开始不错;继续,你会享受Scheme!]
在Scheme中,程序是在一个环境中开发的。环境定义了从标识符到值的映射。一些值是函数,一些是数字等。当你 定义一个函数:
(define (sqrt x)
(sqrt-iter 1.0 x))
标识符x
被绑定为sqrt
的参数,值1.0是数字,标识符sqrt-iter
来自环境。
要问自己的一个问题是“sqrt-iter
定义在哪里;它绑定的是什么?”由于未由您定义,sqrt-iter
必须来自您的Scheme内置环境或导入您的Scheme。您没有导入任何内容,并且未在Scheme中定义sqrt-iter
(请参阅R5RS或其他资源)。因此sqrt-iter
是未绑定的。
同样的逻辑适用于每个标识符,包括您使用word
。
在word?
的实现中,使用了syntactic-keyword let
来引入新的绑定标识符。当您编写(number? number?)
时,您将引入一个新标识符number?
(在左侧)并将其绑定到来自环境的number?
(右侧)(在Scheme中定义)。使用let
这并不是真的在为你买东西。您的word?
代码可以实现为:
(define (word? x)
(or (symbol? x) (number? x) (string? x))) ;; number?