@uents blog

Code wins arguments.

SICP 読書ノート#67 - 4.4.4 質問システムの実装(1) (pp.278)

§4.4.4に入り質問システムの実装を追っていたのですが、詰まってしまいました。

  1. stream-append-delayedinterleave-delayedのストリーム操作がよくわからない
  2. 「§3.5.3 ストリームパラダイムの開発」の前半部で登場していたようだが、思いっきり読み飛ばしていた
  3. 仕方がないので§3.5.3を読み返す
  4. これまでストリームはracket/streamを流用していたが、それでは問題3.63が上手く解けない
  5. 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の記事に追記しました。


※「SICP読書ノート」の目次はこちら