2013年5月14日火曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション)の2(データによる抽象の構築)、2.1(データ抽象入門)、2.1.2(抽象の壁)の問題 2.2、問題 2.3を解いてみる。

その他参考書籍

問題 2.2

コード

sample.scm

(define (make-segment a b)
  (cons a b))

(define (make-point x y)
  (cons x y))

(define (start-segument segment)
  (car segment))

(define (end-segment segment)
  (cdr segment))

(define (x-point p)
  (car p))

(define (y-point p)
  (cdr p))

(define (midpoint-segment segment)
  (define a (start-segument segment))
  (define b (end-segment segment))
  (define x1 (x-point a))
  (define y1 (y-point a))
  (define x2 (x-point b))
  (define y2 (y-point b))
  (make-point (/ (+ x1 x2) 2)
              (/ (+ y1 y2) 2)))

(define (print-point p)
  (newline)
  (display "(")
  (display (x-point p))
  (display ",")
  (display (y-point p))
  (display ")"))

(define a (make-point 0 0))
(define b (make-point 10 0))
(define c (make-point 0 10))
(define d (make-point 10 10))

(define s1 (make-segment a b))
(define s2 (make-segment a c))
(define s3 (make-segment a d))
(define s4 (make-segment b c))
(define s5 (make-segment b d))
(define s6 (make-segment c d))

(define m1 (midpoint-segment s1))
(define m2 (midpoint-segment s2))
(define m3 (midpoint-segment s3))
(define m4 (midpoint-segment s4))
(define m5 (midpoint-segment s5))
(define m6 (midpoint-segment s6))

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

1 ]=> (print-point m1)

(5,0)
;Unspecified return value

1 ]=> (print-point m2)

(0,5)
;Unspecified return value

1 ]=> (print-point m3)

(5,5)
;Unspecified return value

1 ]=> (print-point m4)

(5,5)
;Unspecified return value

1 ]=> (print-point m5)

(10,5)
;Unspecified return value

1 ]=> (print-point m6)

(5,10)
;Unspecified return value

問題 2.3

コード

sample.scm

(define (make-segment a b)
  (cons a b))

(define (make-point x y)
  (cons x y))

(define (start-segument segment)
  (car segment))

(define (end-segment segment)
  (cdr segment))

(define (x-point p)
  (car p))

(define (y-point p)
  (cdr p))

; 4点から長方形を作成
(define (make-rectangle-point a b c d)
  (cons a (cons b (cons c d))))

; 直交する2つのベクトルから長方形を作成
(define (make-rectangle-vector v1 v2)
  (define a (make-point 0 0))
  (define b (make-point (x-point v1) (y-point v1)))
  (define c (make-point (+ (x-point v1) (x-point v2))
                        (+ (y-point v1) (y-point v2))))
  (define d (make-point (x-point v2) (y-point v2)))
  (cons a (cons b (cons c d))))

(define (make-rectangle-segment-ab r)
  (make-segment (rectangle-a r) (rectangle-b r)))

(define (make-rectangle-segment-bc r)
  (make-segment (rectangle-b r) (rectangle-c r)))

(define (make-rectangle-segment-cd r)
  (make-segment (rectangle-c r) (rectangle-d r)))

(define (rectangle-a r)
  (car r))

(define (rectangle-b r)
  (car (cdr r)))

(define (rectangle-c r)
  (car (cdr (cdr r))))

(define (rectangle-d r)
  (cdr (cdr (cdr r))))

(define (length-segment segment)
  (define a (start-segument segment))
  (define b (end-segment segment))
  (define ax (x-point a))
  (define bx (x-point b))
  (define ay (y-point a))
  (define by (y-point b))
  (sqrt (+ (square (- ax bx))
           (square (- ay by)))))

(define (perimeter-rectangle rectangle)
  (define segment-ab (make-rectangle-segment-ab rectangle))
  (define segment-bc (make-rectangle-segment-bc rectangle))
  (define length-segment-ab (length-segment segment-ab))
  (define length-segment-bc (length-segment segment-bc))
  (* 2 (+ length-segment-ab length-segment-bc)))

(define (area-rectangle rectangle)
  (define segment-ab (make-rectangle-segment-ab rectangle))
  (define segment-bc (make-rectangle-segment-bc rectangle))
  (define length-segment-ab (length-segment segment-ab))
  (define length-segment-bc (length-segment segment-bc))
  (* length-segment-ab length-segment-bc))

(define (make-vector a)
  (cons (car a) (cdr a)))

; 4点を指定して長方形を作成
(define rec-1-p (make-rectangle-point (make-point 0 0)
                                    (make-point 0 10)
                                    (make-point 10 10)
                                    (make-point 10 0)))

(define rec-2-p (make-rectangle-point (make-point -5 6)
                                      (make-point -10 1)
                                      (make-point 5 -15)
                                      (make-point 10 -10)))

; 2つのベクトルで上記の2つの長方形と同じ長方形を作成
(define rec-1-v (make-rectangle-vector (make-vector (make-point 0 10))
                                       (make-vector (make-point 10 0))))

(define rec-2-v (make-rectangle-vector (make-vector (make-point 5 5))
                                       (make-vector (make-point 15 -16))))

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

1 ]=> (perimeter-rectangle rec-1-p)

;Value: 40

1 ]=> (perimeter-rectangle rec-1-v)

;Value: 40

1 ]=> (perimeter-rectangle rec-2-p)

;Value: 58.00556002265357

1 ]=> (perimeter-rectangle rec-2-v)

;Value: 58.00556002265357

1 ]=> (area-rectangle rec-1-p)

;Value: 100

1 ]=> (area-rectangle rec-1-v)

;Value: 100

1 ]=> (area-rectangle rec-2-p)

;Value: 155.08062419270823

1 ]=> (area-rectangle rec-2-v)

;Value: 155.08062419270823

1 ]=> ^D
End of input stream reached.
Moriturus te saluto.

0 コメント:

コメントを投稿