SICP 読書ノート#67 - 4.4.4 質問システムの実装(1) (pp.278)
§4.4.4に入り質問システムの実装を追っていたのですが、詰まってしまいました。
stream-append-delayed
やinterleave-delayed
のストリーム操作がよくわからない- 「§3.5.3 ストリームパラダイムの開発」の前半部で登場していたようだが、思いっきり読み飛ばしていた
- 仕方がないので§3.5.3を読み返す
- これまでストリームは
racket/stream
を流用していたが、それでは問題3.63が上手く解けない - SICPの本文を参考にストリームを再実装しよう
で、ストリームをこんな感じで再実装しています。
#lang racket (define (memo-proc proc) (let ((already-run? false) (result false)) (define promise (lambda () (if (not already-run?) (begin (set! result (proc)) (set! already-run? true) result) result))) promise)) #| ;; non-memozing stream (define-syntax cons-stream (syntax-rules () ((_ a b) (cons a (lambda () b))))) |# ;; memoizing stream (define-syntax cons-stream (syntax-rules () ((_ a b) (cons a (memo-proc (lambda () b)))))) (define (stream-car s) (car s)) (define (stream-cdr s) ((cdr s))) (define (stream-null? s) (null? s)) (define the-empty-stream '()) ;; ... (provide (all-defined-out))
これを使って、これまで実装したコードの動作を確認中。結構時間がかかりそう…
(2015/08/21追記) ストリームのコードをGitHubに置きました。
§3.5.3でやり直している問題は、§3.5.3 ストリームパラダイムの開発の記事に追記していく予定。
(2015/09/06追記) §3.5.3の記事に追記しました。