2014-12-05 90 views
0

我最近開始閱讀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)約塞米蒂

任何幫助將不勝感激,謝謝!

回答

2

的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

0

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

0

的定義區域是區分大小寫的,但互動區域不