申请:不是程序方案

时间:2015-11-30 15:27:43

标签: racket

我是新手。我试着做实验室工作,但是......

    #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>

如何解决? 请帮帮我(

1 个答案:

答案 0 :(得分: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

经验教训:

  • 缩进;特别是不要在一行上放两个连续的表格
  • if形式,如果您需要使用begin表单,如果您在中有多个表单 else 部分和双括号
  • 如果您将beginif一起使用,则应尝试使用cond代替if,以免您的代码更具可读性(如左图所示)练习给你)
  • 如果您有多个set!表单,那么您可能不会想到 Scheme方式;严肃地说,发布另一个问题,解释你想要做什么以及这段代码的工作版本!