我有代码
(define (add-ten s)
(let ([f (lambda(s) ((cons 10 (car (s))) (cdr (s))))])
(f s)))
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(。
现在,我想定义一个流(加10(,它可以取流的幂,并给出另一个流。所以,如果我称之为
(result-for-n-times (add-ten powers) 5)
会给出’(10。2( (10。4( (10。8( (10。16( (10。32((。
试试这个:
(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
定义的末尾调用它,也可以在将其传递给add-ten
之前这样调用它:(powers)
。修复此问题,它按预期工作:
(result-for-n-times (add-ten powers) 5)
=> '((10 . 2) (10 . 4) (10 . 8) (10 . 16) (10 . 32))