我正在尝试编写一个方案func,其行为类似于循环。
(loop min max func)
此循环应执行范围min和max(整数)
之间的函数- 像这样的一个例子
(loop 3 6 (lambda (x) (display (* x x)) (newline)))
9
16
25
36
我将函数定义为
( define ( loop min max fn)
(cond
((>= max min) ( ( fn min ) ( loop (+ min 1 ) max fn) ) )
)
)
当我运行代码时,我得到结果然后发生错误。 我无法处理这个错误。
(loop 3 6 (lambda (x) (display(* x x))(newline)))
9
16
25
36
Backtrace:
In standard input:
41: 0* [loop 3 6 #<procedure #f (x)>]
In utku1.scheme:
9: 1 (cond ((>= max min) ((fn min) (loop # max fn))))
10: 2 [#<unspecified> ...
10: 3* [loop 4 6 #<procedure #f (x)>]
9: 4 (cond ((>= max min) ((fn min) (loop # max fn))))
10: 5 [#<unspecified> ...
10: 6* [loop 5 6 #<procedure #f (x)>]
9: 7 (cond ((>= max min) ((fn min) (loop # max fn))))
10: 8 [#<unspecified> ...
10: 9* [loop 6 6 #<procedure #f (x)>]
9: 10 (cond ((>= max min) ((fn min) (loop # max fn))))
10: 11 [#<unspecified> #<unspecified>]
**utku1.scheme:10:31: In expression `((fn min) (loop # max ...))`:
utku1.scheme:10:31:Wrong type to apply: `#<unspecified>`
ABORT: (misc-error)**
答案 0 :(得分:5)
cond表达式的每个子句都具有( cond expr1 expr2 ... )的形式,但是当它们应该分开时,你将expr1和expr2都包装在parens中。解决方案是在开头指定begin
:((>= max min) (begin expr1 expr2))
或隐式begin
:((>= max min) expr1 expr2)
。
或者,使用when
语句而不是cond
可能更有意义,因为您只有一个选择:
(define (loop min max fn)
(when (>= max min)
(fn min)
(loop (+ min 1) max fn)))
由于cond
和when
都是使用if
的宏,因此两个版本都会成为
(define (loop min max fn)
(if (>= max min)
(begin (fn min) (loop (+ min 1) max fn))
(void)))
反正。
答案 1 :(得分:2)
( ( fn min ) ( loop (+ min 1 ) max fn) )
这就是问题所在。您希望这样做是事后执行(fn min)
然后(loop (+ min 1 ) max fn)
。它实际做的是,它执行(fn min)
,然后(loop (+ min 1 ) max fn)
,然后尝试将(fn min)
的结果应用于(loop (+ min 1 ) max fn)
的结果。由于(fn min)
的结果不是函数,因此这是一个错误。
要获得所需内容,请执行( begin (fn min) (loop (+ min 1) max fn) )
。 begin
允许您在彼此之后执行多个表达式。