0

我最近开始阅读 SICP 并做书中的练习。我在命令行上安装了 mit-scheme,在稍微修改后,我偶然发现了 DrRacket 并从http://www.neilvandyke.org/racket-sicp/安装了 SICP 组件

一切正常,直到我来到 Excercise 1.10,当我按照书中的内容编写函数时:

(define (A x y)
  (cond ((= y 0) 0)
        ((= x 0) (* 2 y))
        ((= y 1) 2)
        (else (A (- x 1)
                 (A x (- y 1))))))

然后使用 cmd + R 运行代码,然后当我从 repl 调用它时:

> (A 1 10)

我得到了错误

A: undefined;
cannot reference an identifier before its definition

但是,相同的代码适用于命令行上安装的版本。这是怎么回事?DrRacket mit-scheme 实现是否有问题,或者我在这里做错了什么?

我在 Mac OS X Yosemite 上使用 DrRacket 版本 6.1.1(m3)

任何帮助将不胜感激,谢谢!

4

3 回答 3

4

SICP 语言试图让本书中的示例直接在该语言中工作,但存在一些错误。R6RS 之前的所有 Scheme 版本都不区分大小写,这意味着您可以编写此代码并使其正常运行:

(define (test a)
  (+ A a)) ; A and a are the same

(TEST 5) ; ==> 10

我相信作者的工作基于#!r5rsRacket 中的语言实现,这是与书中使用的版本最接近的活语言。它也像 SICP 一样不区分大小写。但是,两种语言的交互窗口似乎不同。似乎它希望定义窗口中定义的每个标识符都被命名为小写,并且交互窗口区分大小写。(TEST 5)因此,如果您移动到交互窗口,您会收到错误消息:

> (TEST 5)
. . TEST: undefined;
 cannot reference an identifier before its definition

代码和交互由语言模块解析器中的不同解析器函数读取。显然他们使语法不区分大小写,但 read 仍然区分大小写。您可以通过输入(read)并输入它来测试TeSt它会打印TeSt而不是test. 如果您在定义窗口中执行并在交互窗口中(define x 'TeSt)进行评估,则会打印xtest. Racket 通过将每个标识符更改为小写来使其不区分大小写。由于这在 R5RS 和 SICP 中都存在,我希望 SICP 基于 R5RS 并且该错误是继承的。您可以通过两种方式解决此问题。一种是始终使用小写标识符。您将遵循约定,当您前进到区分大小写的方案报告时,它不会受到伤害。另一种方法是在定义窗口的任意位置添加一行:

(#%require r5rs/init) ; fix interactions window

点击RUN后,交互窗口不区分大小写,因为它应该适用于早期的方案。

> (TEST 5)
10
>

快乐黑客!

于 2014-12-10T23:12:28.573 回答
0

fwiw,我尝试调用(a 1 10)并且它有效,虽然我将函数定义为A..我不知道为什么会这样,但我会接受任何详细说明这个问题的答案..将此标记为其他人的答案有同样的问题..

于 2014-12-05T16:50:36.913 回答
0

定义区域区分大小写,但交互区域不区分大小写

于 2014-12-06T16:21:20.777 回答