返回函数的Scheme函数返回意外值

时间:2012-10-02 04:37:49

标签: scheme return r5rs

我在方案中有一个功能

    (define (m-m f)
      (let ((count 0))
      (define (h-m-c?) count)
      (define (r-c) (begin (set! count 0) count))
      (define (m-f m)
        (cond ((eq? m 'h-m-c?) (h-m-c))
              ((eq? m 'r-c) (r-c))
              (else (set! count (+ 1 count)) f)))
      m-f))

其中m-f是返回的函数。

但是,不是返回值,而是返回

    #<procedure:m-f>

看起来代码没有错误,为什么这不会返回可用的值?

1 个答案:

答案 0 :(得分:2)

你告诉它返回m-f。这是您定义的过程的名称,因此它将返回该过程。要使用此返回值,您需要将其分配给另一个变量。

(define thing1 (m-m 'unused))
(define thing2 (m-m 'who-cares))
(thing1 'h-m-c?)
(thing1 'increment)
(thing1 'h-m-c?)
(thing2 'h-m-c?)

其他一些评论:

?结尾的过程名称用于报告true / false的谓词。

begin中您不需要(r-c)。过程体允许多个表达式,并按照begin的顺序执行它们。

为什么没有为count递增的情况定义函数,就像你在其他情况下那样?

使用默认值进行递增似乎不合适,您应该需要一个特定的m参数。

f参数的目的是什么?它唯一用于增量时返回? count的新值不是更有用的返回值吗?似乎它的目的是成为实例的“名称”;如果是这样,也许您应该添加一个新操作来返回名称,而不是在递增时执行此操作。

编辑:

根据以下答案,我怀疑您滥用f参数。它可能应该是您在执行增量时调用的函数。因此,您需要将其作为lambda表达式提供,并返回(f)而不仅仅是f