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变量取出。
答案 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中没有标准的方法来实现这样的目标。