【问题标题】:Scheme function that returns function is returning unexpected value返回函数的方案函数正在返回意外的值
【发布时间】:2012-10-02 04:37:48
【问题描述】:

我在方案中有一个函数

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

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

【问题讨论】:

  • 过程作为值有什么问题?

标签: scheme return r5rs


【解决方案1】:

你告诉它返回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?)

其他一些评论:

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

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

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

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

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

编辑:

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

【讨论】:

  • 谢谢 Barmar,我是新来的计划。我以错误的方式使用该程序。也感谢您的提示。这个过程计算另一个过程被调用的次数,所以它把一个过程作为参数。例如,将这些调用传递给 m-m:(define m-m (make-monitored (sqrt 100))) ;(m-m 'reset-count) ;(m-m (sqrt 100)) ;(m-m 'how-many-calls?)再次感谢您的提示!
猜你喜欢
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
相关资源
最近更新 更多