DrRacket不从SICP练习中运行Ackermann功能1.10

问题描述:

我最近开始阅读SICP并在本书中做了摘录。我在命令行安装了两个mit-scheme,并且在修改了一下之后,我偶然发现DrRacket并安装了http://www.neilvandyke.org/racket-sicp/的SICP组件DrRacket不从SICP练习中运行Ackermann功能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 DrRacket 6.1.1版(M3)约塞米蒂

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

的SICP语言尝试直接使本书工作的例子在语言,但有潜伏的错误。之前R6RS所有方案版本是区分大小写的,这意味着你可以这样写,并使其正常运行:

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

(TEST 5) ; ==> 10 

我相信笔者根据自己在拍的#!r5rs语言实现,这是最接近生活语言文字工作到本书中使用的版本。它也是SICP不区分大小写的。但是,似乎这两种语言的交互窗口工作方式都不相同。看起来好像期望在定义窗口中定义的每个标识符都被命名为好像它是用小写字母来定义的,并且交互窗口是而不是不区分大小写。

​​

的代码和交互是通过在语言模块解析器不同的解析器函数read:所以,你如果移动(TEST 5)到交互窗口得到一个错误。显然,它们使语法不区分大小写,但读取仍然区分大小写。你可以通过输入(read)来测试它,并为其提供TeSt它将打印TeSt而不是test。如果您在定义窗口中输入(define x 'TeSt),并在交互窗口中评估x,则会打印test。通过将每个标识符更改为小写,球拍使其不区分大小写。既然这是R5RS和SICP​​,我希望SICP基于R5RS,并且错误是继承的。你可以用两种方法解决这个问题。一种是始终使用小写字母标识符。您将遵循该惯例,并且在您进入区分大小写的Scheme计划报告时不会受到伤害。另一种方法是在您的定义窗口的任意位置添加一行:

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

你击中后RUN的交互窗口不区分大小写的,因为它应该是一个早期方案。

> (TEST 5) 
10 
> 

快乐黑客!

+0

非常详细的答案,谢谢! – akaralar 2014-12-10 23:15:57

+0

@akaralar不客气:-) – Sylwester 2014-12-10 23:16:45

fwiw,我试着打电话(a 1 10),它的工作,虽然我定义的功能为A ..我不知道为什么这样,但我会接受任何答案详细阐述此问题..标记此至于其他人有同样的问题的答案..

+0

R5RS和更早版本不区分大小写。 '(eq?'a'A); =>#t' – Sylwester 2014-12-05 23:21:24

+0

@Sylwester你能写它作为答案,以便我可以标记它吗?谢谢! – akaralar 2014-12-10 21:21:33

的定义区域是区分大小写的,但互动区域不