2014年3月5日水曜日

開発環境

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

その他参考書籍

問題 2.2

コード(BBEdit, Emacs)

sample.scm

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

;; これまでに書いた手続き
(load "./procedures.scm")

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

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

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

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

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

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

(define (midpoint-segment segment)
  (let ((start (start-segment segment))
        (end (end-segment segment)))
    (let ((start-x (x-point start))
          (start-y (y-point start))
          (end-x (x-point end))
          (end-y (y-point end)))
      (make-point (average start-x end-x)
                  (average start-y end-y)))))

(define (display-point point)
  (display "(")
  (display (x-point point))
  (display ",")
  (display (y-point point))
  (display ")"))

(define (display-segment segment)
  (display "始点")
  (display-point (start-segment segment))
  (display ", ")
  (display "終点")
  (display-point (end-segment segment)))

;; テスト
(define point1 (make-point 0 0))

(define point2 (make-point 10 10))

(define point3 (make-point 10 5))

(define point4 (make-point -10 -10))

(define point5 (make-point -10 -5))

(define segments (map (lambda (point)
                        (make-segment point1
                                      point))
                      (list point2 point3 point4 point5)))

(for-each (lambda (segment)
            (display "線分: ")
            (display-segment segment)
            (display ", ")
            (display "中間値: ")
            (display-point (midpoint-segment segment))
            (print ""))
          segments)

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

$ ./sample.scm
線分: 始点(0,0), 終点(10,10), 中間値: (5,5)
線分: 始点(0,0), 終点(10,5), 中間値: (5,5/2)
線分: 始点(0,0), 終点(-10,-10), 中間値: (-5,-5)
線分: 始点(0,0), 終点(-10,-5), 中間値: (-5,-5/2)
$

0 コメント:

コメントを投稿