返回函数的Scheme函数正在返回意外值
我在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)) (
(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‘多少个电话?)再次感谢你的提示!