ストリーム、問題3.50、問題3.51 – SICP(計算機プログラムの構造と解釈)その145

ストリームの実装の働き

通常のリストと異なり、ストリームでは cdr は選択されるまで評価されて欲しくないので、cons-stream は特殊形式でなければならない。

Gauche ではストリームの実装の違いから SICP の記述が上手く動作しないので、以下のサイトから stream.scm を手に入れてストリーム手続き群を SICP の意図通りに動作するようにしておく。
SICP memo: stream.scm

参考サイト
ストリームでハマる – たぶん、駄文
考えすぎると頭がかゆくなる SICP3章の解答 3.24〜3.62

(load "./stream.scm")

(define (stream-enumerate-interval low high)
  (if (> low high)
      the-empty-stream
      (cons-stream
        low
        (stream-enumerate-interval (+ low 1) high))))

(define (stream-filter pred stream)
  (cond ((stream-null? stream) the-empty-stream)
        ((pred (stream-car stream))
         (cons-stream (stream-car stream)
                      (stream-filter pred
                                     (stream-cdr stream))))
        (else (stream-filter pred (stream-cdr stream)))))

(stream-car
  (stream-cdr
    (stream-filter prime? (stream-enumerate-interval 10000 1000000))))
gosh> 10009

問題3.50

(define (stream-map proc . argstreams)
  (if (stream-null? (car argstreams))
      the-empty-stream
      (cons-stream
        (apply proc (map stream-car argstreams))
        (apply stream-map
               (cons proc (map stream-cdr argstreams))))))

問題3.51

(define (show x)
  (display-line x)
  x)

(define x (stream-map show (stream-enumerate-interval 0 10)))
gosh> 
0x

(stream-ref x 5)
gosh> 
1
2
3
4
55

(stream-ref x 7)
gosh> 
6
77
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»