我有代码
(define (add-ten s)
(let ([f (lambda(s) ((cons 10 (car (s))) (cdr (s))))])
(f s)))
可以是像权力一样的流
(define powers (letrec ([f (lambda (x) (cons x (lambda () (f (* x 2)))))])
(lambda () (f 2))))
我的功能
(result-for-n-times powers 5)
给出'(2 4 8 16 32)。
现在,我想定义一个流(add-ten),它可以获取流权并给出另一个流。所以,如果我称之为
(result-for-n-times (add-ten powers) 5)
会给'((10。2)(10。4)(10。8)(10。16)(10。32))。
答案 0 :(得分:0)
试试这个:
(define powers
(letrec ([f (lambda (x)
(cons x
(lambda () (f (* x 2)))))])
(f 2)))
(define (result-for-n-times s n)
(if (zero? n)
'()
(cons (car s)
(result-for-n-times ((cdr s)) (sub1 n)))))
(define (add-ten s)
(letrec ([f (lambda (x)
(cons (cons 10 (car x))
(lambda () (f ((cdr x))))))])
(f s)))
请注意,add-ten
过程接收流作为参数,但它也必须返回流。因此,必须使用letrec
来定义一个过程,该过程包含从原始流中获取的每个元素,并具有继续构建流的承诺。
另请注意,您实际上并未调用定义powers
的过程,您可以在powers
'定义的末尾调用它,或者将其称为:(powers)
之前将其传递给add-ten
。解决这个问题,它按预期工作:
(result-for-n-times (add-ten powers) 5)
=> '((10 . 2) (10 . 4) (10 . 8) (10 . 16) (10 . 32))