【发布时间】:2014-09-25 04:57:11
【问题描述】:
如何在带有闭包的方案中增加一个值?我正在上 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)
【问题讨论】:
标签: 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)
【问题讨论】:
标签: scheme
使用set! 存储增量值。试试这个:
(define (sum VAL)
(lambda (x)
(set! VAL (add1 VAL))
(* x x VAL)))
因为在调用sum 过程时包含VAL,所以每次调用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-defined 变量,但结果是相同的。但是,如果您需要在初始化 VAL 之前对 n 执行一些操作,这将很有用:
(define (sum n)
(let ((VAL n))
(lambda (x)
(set! VAL (add1 VAL))
(* x x VAL))))
【讨论】: