Scheme 喧闹中的溪流

Scheme 喧闹中的溪流,scheme,racket,Scheme,Racket,有人能帮我更好地理解如何写流吗 我知道流是一个无限的值序列,我学习编程的方法是将它们表示为thunk,调用时生成一对(1)序列中的第一个元素和(2)表示第二个到无限个元素流的thunk 例如: (define powers-of-two (letrec ([f (lambda (x) (cons x (lambda () (f (* x 2)))))]) (lambda () (f 2)))) 我在这里了解到,它只是产生一个2的幂,并且访问这些幂,例如调用(car(po

有人能帮我更好地理解如何写流吗

我知道流是一个无限的值序列,我学习编程的方法是将它们表示为thunk,调用时生成一对(1)序列中的第一个元素和(2)表示第二个到无限个元素流的thunk

例如:

(define powers-of-two
    (letrec ([f (lambda (x) (cons x (lambda () (f (* x 2)))))])
        (lambda () (f 2))))
我在这里了解到,它只是产生一个2的幂,并且访问这些幂,例如调用
(car(powers of two))
将导致
2
,调用
(car((cdr(powers of two)))
将导致4


现在我正试图编写一个名为
红蓝
的流,它在字符串
之间交替,但我对如何构造它有点困惑

为了全面理解Scheme中的流,我推荐SICP书中的一节。它将教您解决流相关问题的基本概念,如问题中的问题

关于问题中的问题,以下是解决问题的总体思路:

  • 构建两个无限流,一个只生成字符串
    “red”
    ,另一个
    “blue”
  • 组合两个流,从一个元素中提取一个元素,然后从另一个元素中提取一个元素(交替),此过程在SICP中称为
    交织

我写了一篇文章,描述了流,提供了一个实现,并给出了许多例子。那里的流与SICP中的流不同,并且在SRFI中以某种方式解释为“更好”。

看起来您在问如何使用thunks构建自己的自定义流,其他人已经回答了这个问题。以防万一,值得注意的是Racket内置了一个流库,大多数敲诈勒索者都会将其用于流

下面是一个例子:

#lang racket
(require racket/stream)
(define reds (stream-cons "red" reds))
(define red-blues (stream-add-between reds "blue"))

;; show ten of them
(for ([i 10] [e (in-stream red-blues)])
  (displayln e))

我是这方面的新手,但以下解决方案似乎也很有效:

 (define red-then-blue
   (letrec ([f (lambda (x) (cons x(lambda ()(f(cond [(string=? x "red") "blue"]
                                              ["red"])))))])
   (lambda () (f "red"))))

你做到了,祝贺你!查看中的Scheme部分,了解SICP样式流的工作示例。这里只有一个宏规则,您可以在整个过程中手动应用它。