从计数方案中获取计数

时间:2015-03-22 18:02:24

标签: scheme procedure

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

如何制作一个将“count”计数器从c1中取出的程序? 我试过了

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

(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中没有标准的方法来实现这样的目标。