【问题标题】:Get count from make-count scheme从 make-count 方案中获取计数
【发布时间】:2015-05-25 17:07:47
【问题描述】:
Scheme> (define make-counter
            (lambda ()
               (let ((count 0))
                  (lambda ()
                     (set! count (+ count 1))
                     count)))


Scheme> (define c1 (make-counter))
C1

Scheme> (c1)
1
Scheme> (c1)
2
Scheme> (c1)
3

如何创建一个从 c1 中取出“计数”计数器的过程? 我试过了

(define get-count
(lambda (q)
  (q)))

但这只是让它运行程序,而不是取出count变量。

【问题讨论】:

    标签: scheme procedure


    【解决方案1】:

    这里是 SICP 风格的解决方案:

    (define make-counter
      (lambda ()
        (let ((count 0))
          (lambda message
            (unless (equal? message '(get))
              (set! count (+ count 1)))
            count))))
    

    例子:

    > (define c (make-counter))        
    > (c)
    1
    > (c)
    2
    > (c 'get)
    2
    > (c 'get)
    2
    > (c)
    3
    > (c 'get)
    3
    

    【讨论】:

      【解决方案2】:

      您必须创建一个单独的过程来提取计数。您可以这样做:

      (define (make-counter)
        (let ((count 0))
          (values (lambda ()
                    (set! count (+ count 1))
                    count)
                  (lambda ()
                    count))))
      

      这里,我们返回两个过程:第一个和之前完全一样,第二个直接返回计数。

      使用示例:

      > (define-values (inc-count get-count) (make-counter))
      > (inc-count)
      1
      > (inc-count)
      2
      > (inc-count)
      3
      > (get-count)
      3
      

      请注意,这与在给定过程的词法环境中提取封闭变量的值不同,我相信这是您的问题所问的问题。在 Scheme 中没有标准的方法来实现这样的事情。

      【讨论】:

        猜你喜欢
        • 2021-08-18
        • 1970-01-01
        • 2022-06-18
        • 2013-02-27
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2011-09-20
        相关资源
        最近更新 更多