2013-02-16 44 views
3

我目前正在通過練習1.3的sicp書。這裏的問題描述:我嘗試用下面的代碼錯誤:無法在空語法環境中綁定名稱

(define (square x) (* x x)) 

(define (sq2largest a b c) 
     ((define large1 (if (> a b) a b)) 
     (define small (if (= large1 a) b a)) 
     (define large2 (if (> c small) c small)) 
     (+ (square large1) (square large2)))) 

來解決它。當我在麻省理工學院的方案運行它

Define a procedure that takes three numbers as arguments and returns the sum of the squares of the two larger numbers.

,我得到了以下錯誤:

;Can't bind name in null syntactic environment: large1 #[reserved-name-item 13]

使用谷歌搜索這個錯誤不會產生很多結果。有人知道我的代碼有什麼問題嗎? (我對Scheme不熟悉)

回答

3

你有太多的括號。如果你在內部定義中取出額外的括號,事情應該會更好。

+0

刪除內部圓括號確實有效,但我不明白如何解決問題。 define的語法是(定義)。我認爲我必須把所有的東西都歸爲,因此需要多加一對括號。 – 2013-02-16 07:27:28

+1

@KietTran基本的'define'形式確實是'(define )''。但是您正在使用變體來定義函數,'(定義())'。您有''部分的額外支持。順便說一下,用於定義函數的第二個變化形式簡單地說就是糖:它是'(定義(lambda())'的簡寫形式。換句話說,「定義函數」意思是定義一個變量,其值是一個'lambda'而不是(說)一個數字或字符串。 – 2013-02-19 02:15:25

3

我會試着打破你的sq2largest程序的結構:

的基本結構是:

(define (sq2largest a b c) 
    ; Body) 

你寫的身體是:

((define large1 (if (> a b) a b)) ; let this be alpha 
(define small (if (= large1 a) b a)) ; let this be bravo 
(define large2 (if (> c small) c small)) ; let this be charlie 
(+ (square large1) (square large2)) ; let this be delta) ; This parentheses encloses body 

因此,身體結構爲:

(alpha bravo charlie delta) 

這意味着:「將bravo,charlie和delta作爲參數傳遞給alpha。」

現在,阿爾法被告知,要採取一堆參數,爲large1保留的命名空間內,未計提任何說法做出...即方案遇到空句法的環境,它不能將任何變量綁定。

圓括號在Scheme(以及大多數,如果不是全部的話,Lisps)中很重要,因爲它們定義了一個過程的範圍並強制執行[1]操作的應用順序。

[1]「不會出現任何不明確的地方,因爲操作符總是最左邊的元素,整個組合由圓括號分隔。」 http://mitpress.mit.edu/sicp/full-text/sicp/book/node6.html

相關問題