2015-11-30 27 views
1

我是新來的球拍。我試圖做的實驗室工作,但...應用程序:不是一個程序方案

#lang scheme 

(define lab2 
    (lambda (currentList counter result) 
    ((let countdown ((i (- (length currentList) 1))) 
     (if (= i 0) (display result) 
      (begin 
       (if (pair? (list-ref currentList i)) ;1 if element is list 
        (if (> (+ 1 counter) result) ;1 if counter > currentResult 
         ((set! counter (+ 1 counter)) (set! result (+ 1 result)) (countdown(- i 1))) ;2 then counter++, result++ 
         ((set! counter (+ 1 counter)) (countdown(- i 1)))) ;2 else counter++ 
        ((set! counter 0) (countdown(- i 1)))) ;1 else counter=0 
       )))))) 

測試:(lab2 '(9 9 9 (0) (0) (0) (0) 9 9 9 9 9 9 (0)9 9 (0) 9 9 9 9 9 9) 0 0)

,但得到這樣的:application: not a procedure; expected a procedure that can be applied to arguments given: #<void> arguments.: #<void>

如何解決? 請幫我((

回答

2

假設你的縮進表示你想要什麼,這將是你的代碼的工作版本:

(define lab2 
    (lambda (currentList counter result) 
    (let countdown ((i (- (length currentList) 1))) 
     (if (= i 0) 
      (display result) 
      (begin 
      (if (pair? (list-ref currentList i)) ;1 if element is list 
       (if (> (+ 1 counter) result) ;1 if counter > currentResult 
        (begin 
         (set! counter (+ 1 counter)) 
         (set! result (+ 1 result)) 
         (countdown(- i 1))) ;2 then counter++, result++ 
        (begin 
         (set! counter (+ 1 counter)) 
         (countdown(- i 1)))) ;2 else counter++ 
       (begin 
        (set! counter 0) 
        (countdown(- i 1))))))))) ;1 else counter=0 

教訓:

  • 縮進正確;尤其是不要把連續的2種形式在一個單行
  • if形式,如果你需要使用一個begin形式,如果你在有不止一種形式則或其他部分雙括號
  • 如果你使用許多beginif你應該嘗試看看是否使用cond代替if不會使你的代碼更具可讀性(作爲練習留給你)
  • 如果你有很多set!表格你可能沒有想到的Scheme方式;嚴重地,在你解釋你想要做什麼以及這個代碼的工作版本的地方張貼另一個問題!
+1

太感謝你了!你真的幫助了我! – Nikkola

+0

使用'add1'比使用'+ 1'更好嗎? –

+0

@Fawful在這裏有很多事情要改變,不使用'add1'是所有問題中最少的。 – uselpa

相關問題