如何在使用Streams的Scheme中制作更好的映射器

如何在使用Streams的Scheme中制作更好的映射器,stream,scheme,Stream,Scheme,map的Scheme实现采用N+1个参数:由N个参数和N个列表组成的过程。此外,当到达最短列表的末尾时,它终止映射 另一种方法是为每个列表提供一个默认值,如果该列表比其他列表短,则将其视为每个列表的下一个元素 这就是定义一个过程streem映射,该映射以以下参数为参数: N个参数的过程 N个元素的列表,这是第N个流的默认值 N流 Streem map生成流,其中第一元素是应用于流的(N)个第一元素的过程,第二元素是应用于流的第二元素的相同过程,依此类推。如果第n个流变为空,streem map将

map的Scheme实现采用N+1个参数:由N个参数和N个列表组成的过程。此外,当到达最短列表的末尾时,它终止映射

另一种方法是为每个列表提供一个默认值,如果该列表比其他列表短,则将其视为每个列表的下一个元素

这就是定义一个过程streem映射,该映射以以下参数为参数:
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))))