0

我在计划中有一个功能

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

其中 mf 是返回的函数。

但是,它不是返回一个值,而是返回

    #<procedure:m-f>

代码似乎没有错误,那么为什么不返回可用值呢?

4

1 回答 1

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?)

其他一些评论:

以 结尾的过程名称?用于报告真/假的谓词。

你不需要begin(r-c). 过程体允许多个表达式,并按顺序执行它们,就像begin.

为什么不count为递增的情况定义一个函数,就像为其他情况所做的那样?

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

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

编辑:

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

于 2012-10-02T06:18:14.510 回答