2014年7月30日水曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の3(標準部品化力、オブジェクトおよび状態)、3.5(ストリーム)、3.5.1(ストリームは遅延リスト)、ストリームの実装の働き、delayとforceの実装、問題 3.51.を解いてみる。

その他参考書籍

問題 3.51.

  1. 0を印字して、xを返す。
  2. 1、2、3、4、5を印字して、5を返す。
  3. 6、7、8、9、10を印字して、10を返す。

コード(BBEdit, Emacs)

stream.scm

#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-

;; メモ化無し
;; (define (delay exp)
;;   (lambda () exp))

;; メモ化あり
(define (delay exp)
  (memo-proc (lambda () exp)))

(define (force delayed-object)
  (delayed-object))

(define (cons-stream x y)
  (cons x (delay y)))

(define (stream-car stream) (car stream))

(define (stream-cdr stream) (force (cdr stream)))

(define (stream-ref s n)
  (if (= n 0)
      (stream-car s)
      (stream-ref (stream-cdr s)
                  (- n 1))))

(define the-empty-stream '())

(define stream-null? null?)

(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)))))

(define (stream-for-each proc s)
  (if (stream-null? s)
      'done
      (begin (proc (stream-car s))
             (stream-for-each proc (stream-cdr s)))))

(define (display-line x)
  (print x))

(define (display-stream s)
  (stream-for-each display-line  s))

(define (memo-proc proc)
  (let ((already-run? #f)
        (result #f))
    (lambda ()
      (if (not already-run?)
          (begin (set! result (proc))
                 (set! already-run? #t)
                 result)
          result))))

;; (define (stream-map proc s)
;;   (if (stream-null? s)
;;       the-empty-stream
;;       (cons-stream (proc (stream-car s))
;;                    (stream-map proc (stream-cdr s)))))

;; 問題 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)

入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))

gosh> (load "./stream.scm")
#t
gosh> (define x (stream-map show (stream-enumerate-interval 0 10)))
0
1
2
3
4
5
6
7
8
9
10
x
gosh> (stream-ref x 5)
5
gosh> (stream-ref x 7)
7
gosh> 

予想と違った出力結果に。どこを勘違いしてるか分からないけど、とりあえず先に進むことに。

0 コメント:

コメントを投稿