为什么我的计数器不能与“ alternate”功能一起使用?

时间:2019-08-14 13:55:29

标签: scheme racket

我必须使一个函数“ alternate”,该函数根据调用“ alternate”的时间返回另一个函数。

我首先尝试使用带有平方函数的简单计数器,它运行良好。

(define square
  (let ((a 0))
    (lambda (x)
      (begin
        (set! a (+ a 1))
        (writeln a)
        (* x x)))))

(map square '(1 2 3 4))

它按预期返回

1
2
3
4
'(1 4 9 16)

我希望下面的程序显示

1
2
3
4
'(2 1 6 2)

但是我不知道为什么计数器似乎保持不变。所以我的程序显示

1
'(2 4 6 8)
(define alternate
  (let ((a 0))
    (lambda (f g selector)
      (begin
        (set! a (+ a 1))
        (writeln a)
        (if (selector a)
            (lambda (x) (f x))
            (lambda (x) (g x)))))))



(map (alternate (lambda (x) (* x 2))
                (lambda (x) (/ x 2))
                odd?)
     (first-n-integers 4))

Ps :(前n个整数4)返回一个列表

'(1 2 3 4)

1 个答案:

答案 0 :(得分:4)

问题在于alternate仅执行一次并返回一个lambda作为其结果-而不是您希望每次都应用它。这应该起作用:

(define (alternate f g selector)
  (let ((a 0))
    (lambda (x)
      (set! a (+ a 1))
      (writeln a)
      (if (selector a)
          (f x)
          (g x)))))

例如:

(map (alternate (lambda (x) (* x 2))
                (lambda (x) (/ x 2))
                odd?)
     (first-n-integers 4))

1
2
3
4
'(2 1 6 2)