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

返回函数的Scheme函数正在返回意外值,scheme,return,r5rs,Scheme,Return,R5rs,我在scheme中有一个函数 (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)) (

我在scheme中有一个函数

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

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

您告诉它返回
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的谓词

您不需要在
(r-c)
中开始
。过程体允许多个表达式,并按顺序执行它们,就像
begin
一样

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

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

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

编辑:


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

过程作为值有什么问题吗?感谢Barmar,我对scheme不熟悉。我用了错误的方法。也谢谢你的提示。此过程统计调用另一个过程的次数,因此它将过程作为参数。例如,对m-m进行以下调用:(定义m-m(makemonitored(sqrt 100));(m-m'重置计数);(m-m(sqrt 100));(m-m‘多少个电话?)再次感谢你的提示!