方案基本循环

时间:2011-01-01 17:29:39

标签: function loops scheme

我正在尝试编写一个方案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)**

2 个答案:

答案 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)))

由于condwhen都是使用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允许您在彼此之后执行多个表达式。