2012-12-22 19 views
1

我已經寫在方案中的下面的代碼錯誤,讓方案

(define (test-for-prime number divisor) 
    (cond (prime? number) (number) 
     (else (let ((next-divisor) (find-next-divisor number (+ 1 divisor))) 
       (test-for-prime (/ number next-divisor) (next-divisor)))))) 

不過,我得到以下錯誤

令:語法錯誤(不具有約束力的標識符和表達)in:(next-divisor)

我該如何糾正它?

回答

2

試試這個版本,它修復所有語法錯誤

(define (test-for-prime number divisor) 
    (cond ((prime? number) 
     number)   
     (else 
     (let ([next-divisor (find-next-divisor number (+ 1 divisor))]) 
      (test-for-prime (/ number next-divisor) next-divisor))))) 

你有很多錯位的括號。有些人錯過了,有些人錯了......我建議你在Scheme教程中好好閱讀,並圍繞編寫一些基本程序來掌握它,特別是herelet特殊文檔和正確的結構形式:

(let ([id val-expr] ...) body ...+) 

第一種形式計算左到右的VAL-exprs,會爲每個ID的新位置,和值放入位置。然後評估綁定ID的身體。最後一個身體表達式相對於let形式處於尾部位置。 ids必須根據bound-identifier =?來區分。

此外,使用IDE /編輯器會強調這類問題並幫助您正確縮進代碼是一個不錯的主意。特別要注意的是,當你寫下這個變量時,一個變量不能被包圍在括號內:(x) Scheme假設x是一個過程並且你正在調用它。

1

Let的語法如下(例如有兩個綁定):

(let ((<var> <expr>) 
     (<var1> <expr1>)) 
    <body>) 

如果我們填寫您的let形式,有兩種綁定:next-divisor被綁定到什麼,find-next-divisor獲取綁定到number,但有第三種形式(+ 1 divisor),它不符合let的語法。

這可能是你想要什麼:

(let ((next-divisor (find-next-divisor number (+ 1 divisor)))) 
    ;; ... 
)