文責: | @naoiwata |
---|
有理数を以下の様に表現するよう定義する.
有理数の構成子
- (make-rat <n> <d>) ... \(\frac {n}{d}\)
有理数の選択子
- (numer <x>) ... 有理数 x の分子
- (denom <x>) ... 有理数 x の分母
ポイント
希望的思考という戦略を使って有理数を定義している. つまり, make-rat, numer, denom それぞれは有理数を表現する為の実装がされるが, この 3 つの手続きを使用する人は, 有理数がどのように実装され表現されているのか知らなくても有理数を扱い表現及び計算ができる. このように合成データにを設計する上で強力な戦略である. データを抽象化する際に重要な思考.
\(\frac {n_1}{d_1} + \frac {n_2}{d_2} = \frac {n_1 d_1 + n_2 d_1}{d_1 d_2}\) を S 式で表現すると以下のようになる.
(define (add-rat x y)
(make-rat (+ (* (numer x) (denom y))
(* (numer y) (denom x)))
(* (denom x) (denom y))))
有理数の足し算を make-rat, numer, denom のみで表現できる.
それでは有理数の内部実装をする為に新しく “対(Pairs)” というデータ構造を定義する.
cons
2 つの引数を取り, 2 つの引数を含む合成データを返す手続き.
car
cons が合成する合成データの第一項
cdr
cons が合成する合成データの第二項
このように, ついで表現されるデータオブジェクトを リスト構造 と呼ぶ.
リストを使うことで用意に有理数を表現することができる.
(define (make-rat n d) (cons n d))
(define (numer x) (car x))
(define (denom x) (cdr x))
データ抽象の考え方を学ぶ為の例題として, 有理数の算出演算を考えた. 希望的思考という, 表現したいデータの表現と内部実装を分離する戦略方法を使い, 有理数を実装した. その実装の際に, 新しくリスト構造というデータオブジェクトを使った.