2015年3月14日土曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の2(データによる抽象の構築)、2.1(データ抽象入門)、2.1.2(抽象の壁)、問題 2.3.を解いてみる。

その他参考書籍

問題 2.3.

コード(BBEdit, Emacs)

(define square (lambda (x) (* x x)))

(define make-segment
  (lambda (start end) (cons start end)))

(define start-segment
  (lambda (segment) (car segment)))

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

(define length-segment
  (lambda (segment)
    (let ((start (start-segment segment))
          (end (end-segment segment)))
      (let ((x1 (x-point start))
            (y1 (y-point start))
            (x2 (x-point end))
            (y2 (y-point end)))
        (sqrt (+ (square (- x2 x1))
                 (square (- y2 y1))))))))

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

(define x-point
  (lambda (point) (car point)))

(define y-point
  (lambda (point) (cdr point)))

(define mid-point
  (lambda (p1 p2)
    (make-point (/ (+ (x-point p1)
                      (x-point p2))
                   2)
                (/ (+ (y-point p1)
                      (y-point p2))
                   2))))

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

(define rectangle-perimeter
  (lambda (rectangle)
    (* 2 (+ (rectangle-width rectangle)
            (rectangle-height rectangle)))))
          
(define rectangle-area
  (lambda (rectangle)
    (* (rectangle-width rectangle)
       (rectangle-height rectangle))))

(define make-rectangle
  (lambda (segment1 segment2)
    (cons segment1 segment2)))

(define rectangle-segment1
  (lambda (rectangle) (car rectangle)))

(define rectangle-segment2
  (lambda (rectangle) (cdr rectangle)))

(define rectangle-width
  (lambda (rectangle)    
    (let ((segment (rectangle-segment1 rectangle)))
      (length-segment segment))))

(define rectangle-height
  (lambda (rectangle)    
    (let ((segment (rectangle-segment2 rectangle)))
      (length-segment segment))))

(define rectangle
  (make-rectangle (make-segment (make-point 0 1)
                                (make-point 1 0))
                  (make-segment (make-point 0 1)
                                (make-point -1 0))))

(print (rectangle-perimeter rectangle))
(print (rectangle-area rectangle))                   

(define make-rectangle
  (lambda (p1 p2 p3) (list p1 p2 p3)))

(define rectangle-p1
  (lambda (rectangle) (car rectangle)))

(define rectangle-p2
  (lambda (rectangle) (cadr rectangle)))

(define rectangle-p3
  (lambda (rectangle) (caddr rectangle)))

(define rectangle-width
  (lambda (rectangle)
    (let ((p1 (rectangle-p1 rectangle))
          (p2 (rectangle-p2 rectangle)))
      (let ((x1 (x-point p1))
            (y1 (y-point p1))
            (x2 (x-point p2))
            (y2 (y-point p2)))
        (sqrt (+ (square (- x2 x1))
                 (square (- y2 y1))))))))

(define rectangle-height
  (lambda (rectangle)
    (let ((p1 (rectangle-p1 rectangle))
          (p3 (rectangle-p3 rectangle)))
      (let ((x1 (x-point p1))
            (y1 (y-point p1))
            (x3 (x-point p3))
            (y3 (y-point p3)))
        (sqrt (+ (square (- x3 x1))
                 (square (- y3 y1))))))))

(define rectangle (make-rectangle (make-point 0 1)
                                  (make-point 1 0)
                                  (make-point -1 0)))

(print (rectangle-perimeter rectangle))
(print (rectangle-area rectangle))

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

$ gosh sample3.scm
5.656854249492381
2.0000000000000004
5.656854249492381
2.0000000000000004
$

0 コメント:

コメントを投稿