我在方案中有一个功能
(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>
看起来代码没有错误,为什么这不会返回可用的值?
答案 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
。