方案

2017-05-31 47 views
0

調用函數的錯誤我的代碼顯示此錯誤 - function call: expected a function after the open parenthesis, but received (void)方案

我不知道爲什麼。它的第三行

(define countdown 
    (lambda (n) 
    (cond ((zero? n) ((display "Time") (newline))) 
     (else 
     ((display n) (newline) (countdown (- n 1))))))) 

回答

1

當使用cond語句時,不需要圍繞結果表達式使用括​​號。一般結構爲:

(cond (condition1 expr1 expr2 expr3 ...)  ;; NOT (... (expr1 expr2 expr3 ...)) 
     (condition2 expr1 expr2 expr3 ...) 
     ... 
     (else ...)) 

所以您的具體情況下可以固定到:

(cond ((zero? n) (display "Time") (newline)) 
     (else (display n) (newline) (countdown (- n 1)))) 

和程序可以改寫爲:

(define countdown 
    (lambda (n) 
    (cond ((zero? n) 
      (displayln "Time")) 
      (else 
      (displayln n) 
      (countdown (- n 1)))))) 

如果包括括號圍繞結果表達式,例如,具有

((display "Time") (newline)) 

,則這將被解釋爲一個過程

(procedure-name arg) 

其中procedure-name取的(display "Time")的值,並且取arg(newline)的值。由於(display "Time")僅用於副作用而沒有返回值,因此您可以獲取常量#<void>以瞭解過程,因此錯誤消息:預期可應用於參數的過程。

1

這裏是abs一個定義:

(define (abs n) 
    ((if (< n 0) - +) n)) 

當給返回評估-的結果,否則+所以如果你是通過-5變得(- -5)和的情況下5獲得通過,也爲負數變成(+ 5)。兩者評估爲5。你看到我正在使用表達式作爲函數返回嗎?這也就是在括號的意思..在一個類似C語言無視圍繞每個學期你有雙括號幾個地方的括號的時候我可能會做類似(n < 0 ? sub : add)(0, n)

在你cond

((display "Time") (newline)) 
((display n) (newline) (countdown (- n 1))) 

他們都假設顯示函數返回一個可以應用的函數。它不會,它會告訴你,這不是一個函數失敗。

如果您正在尋找將命令組合在一起,如C語言中的{},那麼您正在尋找特殊形式begin。例如。(begin 1 2 3) ; ==> 3

cond在它的每一個方面的明確begin所以如果你只是想每一個部分進行評估修訂如下:

(define (countdown n) 
    (cond ((zero? n) (display "Time") (newline)) 
     (else (display n) (newline) (countdown (- n 1))))) 

的另一種方法格式化是這樣的:

(define (countdown n) 
    (cond 
    ((zero? n) 
    (display "Time") (newline)) 
    (else 
    (display n) 
    (newline) 
    (countdown (- n 1))))) 

注意括號與同一級別對齊,以便您知道下一個詞何時開始。它可以幫助你閱讀代碼,因爲你在問題中的格式沒有提供任何線索。得到一個適當的編輯器來做你的編碼。