我必须使一个函数“ 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)
答案 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)