【问题标题】:scheme basic loop方案基本循环
【发布时间】:2011-01-01 17:29:38
【问题描述】:

我正在尝试编写一个类似于循环的模式函数。

(循环最小最大函数)

这个循环应该在最小值和最大值(整数)范围内执行函数

-- 像这样的例子之一

(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)**

【问题讨论】:

    标签: function loops scheme


    【解决方案1】:

    cond 表达式的每个子句都具有 (cond expr1 expr2...) 的形式,但是当 expr1 和 expr2 应该分开时,您将它们包装在括号中。解决方案是在开头指定begin((&gt;= max min) (begin expr1 expr2)) 或使begin 隐含:((&gt;= 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)))
    

    无论如何。

    【讨论】:

      【解决方案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 允许你一个接一个地执行多个表达式。

      【讨论】:

        猜你喜欢
        • 2023-01-25
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多