我有一些难以理解的方案源代码
I have some difficult in understanding Scheme Source Code
以下是我下载的问题示例代码:
计数器递增 1,修改它以将用于递增的值作为参数传递。
例如,
(let ((c (create-counter))) (+ (c) (c) (c) (c))) => 6
(let ((c (create-counter 2))) (+ (c) (c) (c) (c))) => 12
源代码:
(define create-counter
(lambda ([num '()])
(let ((temp (lambda (incr)
(let* ((start (- incr))
(count start))
(lambda num
(set! count (+ incr count)) count)))))
(if (null? num)
(temp 1)
(temp num)))))
这是我自己的代码:
(define create-counter
(let ([count 0])
(lambda ([x '()])
(cond
[(null? x) (set! count (+ 1 count)) (- count 1)]
[(> x 0)(set! count (+ x count)) (- count x)])
)))
我对 let 和 lambda 以及闭包句柄等有一些简单的了解。但是,对于这个极端的问题,我还是想不出像样例代码应该怎么写。我的代码使用以下示例进行计算:
(+ (create-counter 2) (create-counter 2) (create-counter 2) (create-counter 2)) -> 12
但是我的代码不适用于示例测试用例。我有时会得到 0 或错误。
我必须修改我的源代码才能 运行 并作为示例工作?请帮助我更好地理解这个范围和闭包,任何提示都将不胜感激。谢谢你,对不起我的英语不好。
您下载的代码过于复杂。
你的更好,但是对于谁获得指定增量的参数存在混淆。 create-counter
是一个过程,return 是一个过程,但它是您要为其提供参数的第一个,而不是第二个。
另外,当您可以使用默认值 1 时,为什么还要使用默认值 '()
?所以你的代码变成:
(define (create-counter (x 1))
(let ([count 0])
(lambda ()
(set! count (+ x count))
(- count x))))
顺便说一句...而不是再次添加 x
并减去 x
,您可以将 count
的初始值放入一个临时变量中,然后将 return,或者只使用 begin0
:
(define (create-counter (incr 1))
(let ((val 0))
(lambda ()
(begin0
val
(set! val (+ val incr))))))
甚至更短,并且可以选择将初始值设置为 0 以外的值:
(define (create-counter (incr 1) (val 0))
(lambda ()
(begin0
val
(set! val (+ val incr)))))
测试:
> (let ((c (create-counter))) (+ (c) (c) (c) (c))) ; => 6
6
> (let ((c (create-counter 2))) (+ (c) (c) (c) (c))) ; => 12
12
但这不适用于
(+ (create-counter 2) (create-counter 2) (create-counter 2) (create-counter 2)) ; -> 12
因为在这里您期望 create-counter
到 return 一个数值,而实际上它 return 是一个过程。
以下是我下载的问题示例代码: 计数器递增 1,修改它以将用于递增的值作为参数传递。 例如,
(let ((c (create-counter))) (+ (c) (c) (c) (c))) => 6
(let ((c (create-counter 2))) (+ (c) (c) (c) (c))) => 12
源代码:
(define create-counter
(lambda ([num '()])
(let ((temp (lambda (incr)
(let* ((start (- incr))
(count start))
(lambda num
(set! count (+ incr count)) count)))))
(if (null? num)
(temp 1)
(temp num)))))
这是我自己的代码:
(define create-counter
(let ([count 0])
(lambda ([x '()])
(cond
[(null? x) (set! count (+ 1 count)) (- count 1)]
[(> x 0)(set! count (+ x count)) (- count x)])
)))
我对 let 和 lambda 以及闭包句柄等有一些简单的了解。但是,对于这个极端的问题,我还是想不出像样例代码应该怎么写。我的代码使用以下示例进行计算:
(+ (create-counter 2) (create-counter 2) (create-counter 2) (create-counter 2)) -> 12
但是我的代码不适用于示例测试用例。我有时会得到 0 或错误。
我必须修改我的源代码才能 运行 并作为示例工作?请帮助我更好地理解这个范围和闭包,任何提示都将不胜感激。谢谢你,对不起我的英语不好。
您下载的代码过于复杂。
你的更好,但是对于谁获得指定增量的参数存在混淆。 create-counter
是一个过程,return 是一个过程,但它是您要为其提供参数的第一个,而不是第二个。
另外,当您可以使用默认值 1 时,为什么还要使用默认值 '()
?所以你的代码变成:
(define (create-counter (x 1))
(let ([count 0])
(lambda ()
(set! count (+ x count))
(- count x))))
顺便说一句...而不是再次添加 x
并减去 x
,您可以将 count
的初始值放入一个临时变量中,然后将 return,或者只使用 begin0
:
(define (create-counter (incr 1))
(let ((val 0))
(lambda ()
(begin0
val
(set! val (+ val incr))))))
甚至更短,并且可以选择将初始值设置为 0 以外的值:
(define (create-counter (incr 1) (val 0))
(lambda ()
(begin0
val
(set! val (+ val incr)))))
测试:
> (let ((c (create-counter))) (+ (c) (c) (c) (c))) ; => 6
6
> (let ((c (create-counter 2))) (+ (c) (c) (c) (c))) ; => 12
12
但这不适用于
(+ (create-counter 2) (create-counter 2) (create-counter 2) (create-counter 2)) ; -> 12
因为在这里您期望 create-counter
到 return 一个数值,而实际上它 return 是一个过程。