2013-01-14 46 views
1
(define (subtract-1 n) 
    (string-append "Number is: " (number->string n)) 
    (cond 
    [(= n 0) "All done!"] 
    [else (subtract-1(- n 1))])) 

我不斷收到錯誤:define:預計只有一個函數體的表達式,但找到1個額外的部分。我不明白爲什麼我得到這個。爲什麼這個表達式給我一個函數體錯誤?

自我注意事項:使用DrRacket時,將語言設置爲BSL可能會在編譯時使Racket命令出錯。

+0

'(string-append ...)'和'(cond ...)'都在函數體中。 –

+0

@ dotnetN00b:是的,BSL是Racket的一種限制形式,其中函數只能在它們的主體中有一個表達式。限制旨在幫助初學者將副作用與價值混淆:它會迫使你寫作時不會產生副作用。如果你想要副作用,你需要在BSL之外。順便說一句,在上面的代碼中,似乎有些混亂:看起來你想打印一條日誌消息,但代碼實際上是_computing_一條不會被看到的日誌消息。 – dyoo

回答

4

您正在使用的語言(BSL)只允許程序正文中的單個表達式,如果有多個表達式,則需要將它們打包在begin之內。

另請注意,string-append行沒有任何作用,您應該打印它或累積它。這裏是我的建議,一個可能的解決方案到位:

(define (subtract-1 n) 
    (begin 
    (display (string-append "Number is: " (number->string n) "\n")) 
    (cond 
     [(= n 0) "All done!"] 
     [else (subtract-1 (- n 1))]))) 

更妙的是,使用printf程序爲簡單起見:

(define (subtract-1 n) 
    (begin 
    (printf "~a ~s~n" "Number is:" n) 
    (cond 
     [(= n 0) "All done!"] 
     [else (subtract-1 (- n 1))]))) 

無論哪種方式的樣本執行如下:

(subtract-1 3) 
=> Number is: 3 
=> Number is: 2 
=> Number is: 1 
=> Number is: 0 
=> "All done!" 
1

球拍文檔(Sequencing)似乎表明您可能需要使用開始表達式才能起作用,否則可能會丟失函數名和參數之間的空間(subtract-1(- n 1))

此外,你可能想輸出 string-append的結果,因爲它並沒有真正做任何事情。示例掩蓋所有這些要點:

(define (subtract-1 n) 
    (begin 
     (write (string-append "Number is: " (number->string n))) 
     (cond 
      [(= n 0) "All done!"] 
      [else (subtract-1 (- n 1))]))) 
+0

「您可能需要將身體包裹在額外的括號內」< - 這是不好的建議,完全不正確! –

+0

@OscarLopez我的壞。跟蹤球拍文檔並相應更新。 –

相關問題