;;; 50-stream-map.scm
(define (stream-map proc . list-of-stream)
(if (null? (car list-of-stream))
'()
(cons-stream
(apply proc
(map (lambda (s)
(stream-car s))
list-of-stream))
(apply stream-map
(cons proc (map (lambda (s)
(stream-cdr s))
list-of-stream))))))
测试:
1 ]=> (load "50-stream-map.scm")
;Loading "50-stream-map.scm"... done
;Value: stream-map
1 ]=> (load "p223-stream-enumerate-interval.scm")
;Loading "p223-stream-enumerate-interval.scm"... done
;Value: stream-enumerate-interval
1 ]=> (define one-to-ten (stream-enumerate-interval 1 10)) ; 一个 1 至 10 的整数序列
;Value: one-to-ten
1 ]=> (stream-map + one-to-ten one-to-ten) ; 直接调用还是会返回流
;Value 17: (2 . #[promise 18])
1 ]=> (load "p222-display-stream.scm") ; 所以需要 display-stream 的帮助
; 将流求值并打印出来
;Loading "p222-display-stream.scm"... done
;Value: display-line
1 ]=> (display-stream (stream-map + one-to-ten one-to-ten))
2
4
6
8
10
12
14
16
18
20
;Unspecified return value