我最近开始阅读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)
任何帮助将不胜感激,谢谢!
3 回答
SICP语言尝试直接使用该语言使本书的示例工作,但是存在潜伏的错误 . R6RS之前的所有Scheme版本都不区分大小写,这意味着您可以编写此版本并使其运行正常:
我相信作者将他们的工作 Build 在Racket的
#!r5rs
语言实现上,这是本书中使用的最接近版本的语言 . 它也像SICP一样不区分大小写 . 但是,对于两种语言,交互窗口似乎都有所不同 . 似乎它期望定义窗口中定义的每个标识符都被命名为好像它是以小写形式定义的,并且交互窗口是不区分大小写的 . 因此,如果将(TEST 5)
移动到交互窗口,则会出现错误:代码和交互由语言模块解析器中的不同解析器函数读取 . 显然他们已经使语法区分不敏感,但读取仍然区分大小写 . 您可以输入
(read)
并将其输入TeSt
进行测试,它将打印TeSt
而不是test
. 如果您在定义窗口中执行(define x 'TeSt)
并在交互窗口中评估x
,则会打印test
. 通过将每个标识符更改为小写,Racket使其不区分大小写 . 由于这是在R5RS和SICP中我希望SICP基于R5RS并且该bug是继承的 . 您可以通过两种方式解决此问题 . 一种是始终使用小写标识符 . 当您提前进入区分大小写的计划报告时,您会受到伤害 . 另一种方法是在定义窗口的任何位置添加一行:点击RUN后,交互窗口不区分大小写,因为它应该是早期的Scheme .
快乐的黑客!
fwiw,我试着调用
(a 1 10)
并且它有效,虽然我将函数定义为A
..我不接受任何详细阐述此问题的答案 . 将此标记为其他任何具有相同问题的答案 .“定义”区域区分大小写,但“交互”区域不区分大小写