2014年8月18日月曜日

開発環境

計算機プログラムの構造と解釈[第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.3(ストリームパラダイムの開発)、対の無限のストリーム、問題 3.70.を解いてみる。

その他参考書籍

問題 3.70.

コード(BBEdit, Emacs)

sample70.scm

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

(load "./stream.scm")

(define (merge-weighted pairs1 pairs2 weight)
  (cond ((stream-null? pairs1) pairs2)
        ((stream-null? pairs2) pairs1)
        (else
         (let ((pairs1car (stream-car pairs1))
               (pairs2car (stream-car pairs2)))
           (if (< (weight pairs1car) (weight pairs2car))
               (cons-stream pairs1car
                            (merge-weighted (stream-cdr pairs1)
                                            pairs2
                                            weight))
               (cons-stream pairs2car
                            (merge-weighted pairs1
                                            (stream-cdr pairs2)
                                            weight)))))))

(define (weighted-pairs s t weight)
  (cons-stream
   (list (stream-car s) (stream-car t))
   (merge-weighted
    (stream-map (lambda (x)
                  (list (stream-car s) x))
                (stream-cdr t))
    (weighted-pairs (stream-cdr s)
                    (stream-cdr t)
                    weight)
    weight)))

(define a (weighted-pairs integers
                          integers
                          (lambda (pair)
                            (+ (car pair) (cadr pair)))))

(define b (stream-filter (lambda (pair)
                           (let ((i (car pair))
                                 (j (cadr pair)))
                             (and (not (= (remainder i 2) 0))
                                  (not (= (remainder i 3) 0))
                                  (not (= (remainder i 5) 0))
                                  (not (= (remainder j 2) 0))
                                  (not (= (remainder j 3) 0))
                                  (not (= (remainder j 5) 0)))))
                         (weighted-pairs
                          integers
                          integers
                          (lambda (pair)
                            (let ((i (car pair))
                                  (j (cadr pair)))
                              (+ (* 2 i) (* 3 j) (* 5 i j)))))))
                            

(define (enumerate-interval low high)
  (if (> low high)
      '()
      (cons low
            (enumerate-interval (+ low 1)
                                high))))

(define (test s)
  (for-each (lambda (n)
              (print (stream-ref s n)))
            (enumerate-interval 0 20)))

(print "a.")
(test a)
(print "b.")
(test b)

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

$ ./sample70.scm
a.
(1 1)
(1 2)
(2 2)
(1 3)
(2 3)
(1 4)
(3 3)
(2 4)
(1 5)
(3 4)
(2 5)
(1 6)
(4 4)
(3 5)
(2 6)
(1 7)
(4 5)
(3 6)
(2 7)
(1 8)
(5 5)
b.
(1 1)
(1 7)
(1 11)
(1 13)
(1 17)
(1 19)
(1 23)
(1 29)
(1 31)
(7 7)
(1 37)
(1 41)
(1 43)
(1 47)
(1 49)
(1 53)
(7 11)
(1 59)
(1 61)
(7 13)
(1 67)

0 コメント:

コメントを投稿