我对理解计划源代码有一些困难

时间:2016-03-09 17:47:09

标签: lambda scheme racket counter let

以下是我为此问题下载的示例代码: 计数器递增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或错误。

我需要修改源代码才能运行并作为示例工作?请帮助我更好地了解这个范围和闭包的东西,任何提示都会非常感激。谢谢,抱歉我的英语不好。

1 个答案:

答案 0 :(得分:1)

您下载的代码不必要地复杂。

你的更好,但是谁得到指定增量的参数会产生混淆。 create-counter是一个返回过程的过程,但它是您要为其提供参数的第一个过程,而不是第二个过程。

另外,当您可以使用默认值1时,为什么使用默认值'()?所以你的代码变成了:

(define (create-counter (x 1))
  (let ([count 0])
    (lambda ()
      (set! count (+ x count))
      (- count x))))

顺便说一句......您可以将x的初始值放入临时变量并返回该值,或者只使用{而不是添加x并再次减去countbegin0

(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返回一个数值,当它确实返回一个过程时。