如何在使用Streams的Scheme中制作更好的映射器
map的Scheme实现采用N+1个参数:由N个参数和N个列表组成的过程。此外,当到达最短列表的末尾时,它终止映射 另一种方法是为每个列表提供一个默认值,如果该列表比其他列表短,则将其视为每个列表的下一个元素 这就是定义一个过程streem映射,该映射以以下参数为参数:如何在使用Streams的Scheme中制作更好的映射器,stream,scheme,Stream,Scheme,map的Scheme实现采用N+1个参数:由N个参数和N个列表组成的过程。此外,当到达最短列表的末尾时,它终止映射 另一种方法是为每个列表提供一个默认值,如果该列表比其他列表短,则将其视为每个列表的下一个元素 这就是定义一个过程streem映射,该映射以以下参数为参数: N个参数的过程 N个元素的列表,这是第N个流的默认值 N流 Streem map生成流,其中第一元素是应用于流的(N)个第一元素的过程,第二元素是应用于流的第二元素的相同过程,依此类推。如果第n个流变为空,streem map将
N个参数的过程
N个元素的列表,这是第N个流的默认值
N流 Streem map生成流,其中第一元素是应用于流的(N)个第一元素的过程,第二元素是应用于流的第二元素的相同过程,依此类推。如果第n个流变为空,streem map将使用第n个默认元素。因此,streem映射生成的流将始终具有无限长;如果所有N个输入流的长度都是有限的,那么最终它将生成由 应用于N个默认值的过程 例如:
(streem-map (lambda (x y z) (* x y z))
‘(0 1 2)
(list->streem ‘(1 2 3))
(list->streem ‘(9 9))
(list->streem ‘(4))
将生成由以下内容组成的无限流:'(36 36 6 0 0 0…让我们首先定义一组基本流原语,以便代码的其余部分有意义:
(define-syntax stream-cons
(syntax-rules ()
((stream-cons obj expr)
(cons obj (delay expr)))))
(define stream-car car)
(define (stream-cdr p) (force (cdr p)))
(define stream-null? null?)
有了这些,我们可以定义“streems”的操作,即我们的“更好的流”
您应该能够轻松地将其适应于您已经使用的任何流库。
您不需要单独的列表->streem转换,您可以传递streem map常规流(可能是使用列表->流创建的)。如果您使用的流,这只是流展开的一个应用程序。注:我是SRFI-41的作者
(define (streem-car stream default)
(if (stream-null? stream) default (stream-car stream)))
(define (streem-cdr stream)
(if (stream-null? stream) stream (stream-cdr stream)))
(define (streem-map proc defaults . streams)
(stream-cons (apply proc (map streem-car streams defaults))
(apply streem-map proc defaults (map streem-cdr streams))))