計算機プログラムの構造と解釈 第二版 P49 問題2.2

この問題とてもいい問題だと僕は思うのです。
日本語が難しいですが、
文章を読んで、図をイメージする力も大切だと、
世間では言いますし。


求めるのは、こんな感じになるのかな。

  • 構成子: make-segment
  • 選択子: start-segment
  • 選択子: end-segment

  • 構成子: make-point
  • 選択子: x-point
  • 選択子: y-point

  • make-segmentの中間点を返す手続き: midpoint-segment

をつくる。


そんで、出力する手続き
porint-point
にパラメータとして与えてちゃんとできているか確かめるという内容です。


長いな。


そもそも直線って、2点からなってます。

                               ↓ここ(end-segment)
 ・----------------------------・
 ↑ここ(start-segment)

こういう直線を作るのがmake-segment


んで、start-segmentとend-segmentが何からできてるかって、
「ある点」ではあるんだけど、X軸Y軸がある二次元の空間だと


 
   |Y軸
   |
   |
   |         ・ある点(x,y)
   |
---+---------------------------------
   |                            X軸
   |
   |
   |

て表現ができる。
これが、make-point


mid-pointはある二点間の中間地点をとればよろし。


ということで、実装

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

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


(define (make-segment s e)
  (cons s e)) 


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


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


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


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


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


(define (midpoint-segment l)
  (make-point (/ (+ (x-point (start-segment l))  (x-point (end-segment l))) 2)
              (/ (+ (y-point (start-segment l))  (y-point (end-segment l))) 2)))

;; main
(define (main args)

  (display "始点(x=1, y=7) ")(newline)
  (display "終点(x=3, y=1) の中間点は?")(newline)
  (print-point
    (midpoint-segment
      (make-segment
        (make-point 1 7)
        (make-point 3 1))))
0)


実行

始点(x=1, y=7) 
終点(x=3, y=1) の中間点は?
(2,4)


OKとおもう。