開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: MIT/GNU Scheme
計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション)の2(データによる抽象の構築)、2.2(階層データ構造と閉包)、2.2.4(例: 図形言語)の問題 2.45、問題 2.46、問題 2.47、問題 2.48、問題 2.49を解いてみる。
その他参考書籍
問題 2.45
コード
sample.scm
(define (split proc-1 proc-2)
  (lambda (painter n)
    (if (= n 0)
        painter
        (let ((smaller ((split proc-1 proc-2) painter (- n 1))))
          (proc-1 painter (proc-2 smaller smaller))))))
問題 2.46
コード
sample.scm
(define (make-vect x y)
  (cons x y))
(define (xcor-vect v)
  (car v))
(define (ycor-vect v)
  (cdr v))
(define (add-vect v1 v2)
  (let ((x1 (xcor-vect v1))
        (y1 (ycor-vect v1))
        (x2 (xcor-vect v2))
        (y2 (ycor-vect v2)))
    (make-vect (+ x1 x2) (+ y1 y2))))
(define (sub-vect v1 v2)
  (let ((x1 (xcor-vect v1))
        (y1 (ycor-vect v1))
        (x2 (xcor-vect v2))
        (y2 (ycor-vect v2)))
    (make-vect (- x1 x2) (- y1 y2))))
(define (scale-vect s v)
  (let ((x (xcor-vect v))
        (y (ycor-vect v)))
    (make-vect (* s x) (* s y))))
問題 2.47
コード
sample.scm
(define (origin-frame-list frame) (car frame)) (define (edge1-frame-list frame) (cadr frame)) (define (edge2-frame-list frame) (caddr frame)) (define (origin-frame-cons frame) (car frame)) (define (edge1-frame-cons frame) (cadr frame)) (define (edge2-frame-cons frame) (cddr frame))
問題 2.48
コード
sample.scm
(define (make-segment v1 v2) (cons v1 v2)) (define (start-segment v) (car v)) (define (end-segment v) (cdr v))
問題 2.49
コード
sample.scm
(define outline-painter
  (segments->painter
    (list (make-segment (make-vect 0 0)
                        (make-vect 0 1))
          (make-segment (make-vect 0 1)
                        (make-vect 1 1))
          (make-segment (make-vect 1 1)
                        (make-vect 1 0))
          (make-segment (make-vect 1 0)
                        (make-vect 0 0)))))
(define x-painter
  (segments->painter
    (list (make-segment (make-vect 0 0)
                        (make-vect 1 1))
          (make-segment (make-vect 1 0)
                        (make-vect 0 1)))))
(define diamond-painter
  (segments->painter
    (list (make-segment (make-vect 0.5 0)
                        (make-vect 0 0.5))
          (make-segment (make-vect 0 0.5)
                        (make-vect 0.5 1))
          (make-segment (make-vect 0.5 1)
                        (make-vect 1 0.5))
          (make-segment (make-vect 1 0.5)
                        (make-vect 0.5 0)))))
(define wave
  (segments->painter
    (list (make-segment (make-vect 0.25 0)
                        (make-vect 0.3 0.6))
          (make-segment (make-vect 0.3 0.6)
                        (make-vect 0.275 0.65))
          (make-segment (make-vect 0.275 0.65)
                        (make-vect 0.2 0.5))
          (make-segment (make-vect 0.2 0.5)
                        (make-vect 0 0.7))
          (make-segment (make-vect 0 0.8)
                        (make-vect 0.2 0.65))
          (make-segment (make-vect 0.2 0.65)
                        (make-vect 0.3 0.7))
          (make-segment (make-vect 0.3 0.7)
                        (make-vect 0.4 0.7))
          (make-segment (make-vect 0.4 0.7)
                        (make-vect 0.35 0.9))
          (make-segment (make-vect 0.35 0.9)
                        (make-vect 0.4 1))
          (make-segment (make-vect 0.6 1)
                        (make-vect 0.65 0.9))
          (make-segment (make-vect 0.65 0.9)
                        (make-vect 0.6 0.7))
          (make-segment (make-vect 0.6 0.7)
                        (make-vect 0.7 0.7))
          (make-segment (make-vect 0.7 0.7)
                        (make-vect 1 0.4))
          (make-segment (make-vect 1 0.2)
                        (make-vect 0.6 0.5))
          (make-segment (make-vect 0.6 0.5)
                        (make-vect 0.75 0))
          (make-segment (make-vect 0.6 0)
                        (make-vect 0.5 0.25))
          (make-segment (make-vect 0.5 0.25)
                        (make-vect 0.4 0)))))
waveは図を見ながら大雑把に定義。
HTML5のcanvas要素、JavaScriptとかを使って実際に出力して合ってるか確かめてみたいけど、とりあえず先に進むことを優先することに。本書を最後まで終えてから、ブラウザ上に描けるように実装してみるかも。
2013/06/02 追記:
ブラウザ上に描けるように実装。JavaScript - Schemeの図形言語(picture language)をHTML5のcanvas要素で実装)
 
0 コメント:
コメントを投稿