Scheme 如何在带有闭包的方案中增加值?

Scheme 如何在带有闭包的方案中增加值?,scheme,Scheme,如何在带有闭包的方案中增加值?我在上sicp课程的第3A课 (define (sum VAL) // how do I increment VAL everytime i call it? (lambda(x) (* x x VAL))) (define a (sum 5)) (a 3) 使用set。试试这个: (define (sum VAL) (lambda (x) (set! VAL (add1 VAL)) (* x x V

如何在带有闭包的方案中增加值?我在上sicp课程的第3A课

(define (sum VAL)

    // how do I increment VAL everytime i call it?

    (lambda(x)  
        (* x x VAL)))

(define a (sum 5))

(a 3)

使用
set。试试这个:

(define (sum VAL)
  (lambda (x)
    (set! VAL (add1 VAL))
    (* x x VAL)))
因为
VAL
在调用
sum
过程时是封闭的,所以每次调用
a
时,它都会“记住”
VAL
中的上一个值,并将其递增一个单位。例如:

(define a (sum 5)) ; VAL = 5

(a 3)  ; VAL = 6
=> 54  ; (* 3 3 6)

(a 3)  ; VAL = 7
=> 63  ; (* 3 3 7)
回答评论:当然,你可以使用
let
,但这并不是必须的,它的效果和以前一样。不同之处在于,在前面的代码中,我们修改了一个封闭的函数参数,现在我们修改了一个封闭的
let
定义的变量,但结果是相同的。但是,如果在初始化
VAL
之前需要对
n
执行某些操作,这将非常有用:

(define (sum n)
  (let ((VAL n))
    (lambda (x)
      (set! VAL (add1 VAL))
      (* x x VAL))))

@Runner3431嗯,是的。。。但这不是必须的。请参阅我的最新答案。