方案基本循环

tkc*_*kcn 3 scheme loops function

我正在尝试编写一个方案func,其行为类似于循环.

(loop min max func)

此循环应执行范围最小值和最大值之间的函数(整数)

- 像这样的一个例子

(loop 3 6 (lambda (x) (display (* x x)) (newline)))

9
16
25
36
Run Code Online (Sandbox Code Playgroud)

我将函数定义为

( define ( loop min max fn)
    (cond
        ((>= max min) ( ( fn min ) ( loop (+ min 1 ) max fn)  ) )
    )
)
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,我得到结果然后发生错误.我无法处理这个错误.

(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)**
Run Code Online (Sandbox Code Playgroud)

erj*_*ang 5

cond表达式的每个子句都具有(cond expr1 expr2 ...)形式,但是当它们应该分开时,你已经将expr1和expr2包装在parens中.解决方案是begin在开头指定:((>= max min) (begin expr1 expr2))或者begin隐式:((>= max min) expr1 expr2).

或者,使用when语句而不是a 可能更有意义cond,因为您只有一个选择:

(define (loop min max fn)
  (when (>= max min)
    (fn min)
    (loop (+ min 1) max fn)))
Run Code Online (Sandbox Code Playgroud)

因为这两个condwhen是使用宏if,两个版本变成

(define (loop min max fn)
  (if (>= max min)
    (begin (fn min) (loop (+ min 1) max fn))
    (void)))
Run Code Online (Sandbox Code Playgroud)

无论如何.