我是新手。我试着做实验室工作,但是......
#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>
如何解决? 请帮帮我(
答案 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 部分和不双括号begin
与if
一起使用,则应尝试使用cond
代替if
,以免您的代码更具可读性(如左图所示)练习给你)set!
表单,那么您可能不会想到 Scheme方式;严肃地说,发布另一个问题,解释你想要做什么以及这段代码的工作版本!