問題2.84 – SICP(計算機プログラムの構造と解釈)その94
問題2.84 2つの型を引数にとり "型の塔" の中でより高い方の型を返す手続き。 "型の塔" に新レベルを追加するには (tower ‘(complex real rational scheme-number)) に型を追加すればよい。 (define (higher-type x y) (let ((tower ‘(complex real ration…続きを読む
問題2.84 2つの型を引数にとり "型の塔" の中でより高い方の型を返す手続き。 "型の塔" に新レベルを追加するには (tower ‘(complex real rational scheme-number)) に型を追加すればよい。 (define (higher-type x y) (let ((tower ‘(complex real ration…続きを読む
問題2.83 汎用 raise 演算を定義する。 (define (raise x) (apply-generic ‘raise x)) 整数(scheme-number をそのまま使う)にraise 演算を組み込む。 (define (install-scheme-number-package) … (put ‘raise ‘(scheme-number) (lambda (x) (make…続きを読む
問題2.82 最初の引数の型に合わせて一括変換をして、 op に対応する演算が存在すれば演算を実行し、存在しなければ再帰的に次に引数の型合わせた処理をしていく。 (define (apply-generic op . args) (define (coerce-all args target-type-tag) ;; 引数(args) の各要素を全て target-type-tag 型に変換する(…続きを読む
問題2.81 強制型変換に対応した元の apply-generic (define (apply-generic op . args) (let ((type-tags (map type-tag args))) (let ((proc (get op type-tags))) (if proc (apply proc (map contents args)) (if (= (length arg…続きを読む
問題2.80 各算術演算パッケージに =zero? 手続きとインターフェースを追加する。 ;; 通常(ordinary)の算術演算パッケージに =zero? を追加 (put ‘=zero? ‘(scheme-number) (lambda (x) (= x 0))) ;; 有理数算術演算パッケージに =zero? を追加 (define (=zero-rat? x) (= (numer x) 0…続きを読む
問題2.79 各算術演算パッケージに equ? 手続きとインターフェースを追加する。 ;; 通常(ordinary)の算術演算パッケージに equ? を追加 (put ‘equ? ‘(scheme-number scheme-number) (lambda (x y) (= x y))) ;; 有理数算術演算パッケージ equ? を追加 (define (equ-rat? x y) (and (=…続きを読む
問題2.78 元の scheme-number での演算 (add (make-scheme-number 2) (make-scheme-number 3)) gosh> (scheme-number . 5) 最初に考えた解答 (define (type-tag datum) (if (pair? datum) (car datum) ‘scheme-number)) (define (…続きを読む
問題2.77 まず、複素数の選択肢を complex パッケージに登録していない場合をトレースしてみる。 (use slib) (require ‘trace) (define z (make-complex-from-real-imag 3 4)) (trace magnitude) (trace get) (trace apply-generic) (trace type-tag) (magn…続きを読む
問題2.75 (define (make-from-mag-ang r a) (define (dispatch op) (cond ((eq? op ‘real-part) (* r (cos a))) ((eq? op ‘imag-part) (* r (sin a))) ((eq? op ‘mgnitude) r) ((eq? op ‘angle) a) (else (error "…続きを読む
問題2.74 事業所レコードの構造を次のようにする。 ; 事業所レコードの構造(東京事業所) (type-tag (record1) (record2) …) (tokyo (isono nakano1-2 150000) (nakajima setagaya2-1 250000) …) ; 従業員レコードの構造(東京事業所) (name address salary) (isono na…続きを読む