stream - Racket 中的可变 zip

标签 stream scheme lisp racket

我已经看到了other answers关于 Racket 中的压缩函数,但它们首先不太正确(zip 应该只压缩到提供的最短序列,以便您可以使用无限流进行压缩),最重要的是不是可变的,因此您可以一次只能压缩两个流。

到目前为止我已经弄清楚了

 (define (zip a-sequence b-sequence) (for/stream ([a a-sequence]
                                                  [b b-sequence])
                                       (list a b)))

它工作正常

 (stream->list (zip '(a b c) (in-naturals)))
  => '((a 0) (b 1) (c 2))

但不是可变的。我知道我可以使用 define (zip .sequence) 将其定义为可变参数,但我不知道如何构建 for/stream 表单。

这必须是宏才可行吗?

最佳答案

这对你有用吗?

#lang racket

(define (my-zip . xs)
  (match xs
    [(list x) (for/stream ([e x]) (list e))]
    [(list x xs ...)
     (for/stream ([e x] [e* (apply my-zip xs)])
       (cons e e*))]))

(stream->list
 (my-zip (in-naturals) '(a b c) '(1 2 3 4 5 6)))
;;=> '((0 a 1) (1 b 2) (2 c 3))

关于stream - Racket 中的可变 zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59232050/

相关文章:

scheme - 重新定义 `if`时无限递归,为什么?

c++ - 由于 cout<<cin.rdbuf() 导致无限循环,为什么?

scheme - 如何读取加载到 guile 变量中的文件?

algorithm - 在方案中制作树

algorithm - 如何根据简化语法解析单词列表?

lisp - lisp 库的良好来源?

c - lstat 返回 <0

c - 从 C 文件中读取原语

ios - 如何在 iOS 中使用 MPMoviePlayerController 播放视频流

recursion - 在 Common LISP 中递归地连接字符列表