開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- プログラミング言語: MIT/GNU Scheme
計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の2(データによる抽象の構築)、2.5(汎用演算のシステム)、2.5.1(汎用算術演算)の問題 2.77、問題 2.78、問題 2.79、問題 2.80を解いてみる。
その他参考書籍
問題 2.77
汎用選択子、magnitudeの定義。
(define (magnitude z) (apply-generic 'magnitude z))
式(magnitude z)を評価する時。
(apply-generic 'magnitude (cons 'complex (cons 'rectangular (cons 3 4)))) (map type-tag (list (cons 'complex (cons 'rectangular (cons 3 4))))) (get 'magnitude '(complex)) (apply magnitude (list (cons 'rectangular (cons 3 4)))) (magnitude (cons 'rectangular (cons 3 4))) (apply-generic 'magnitude (cons 'rectangular (cons 3 4))) (map type-tag (list (cons 'rectangular (cons 3 4)))) (get 'magnitude '(rectangular)) ;; 以下のmagnitudeはrectangularパッケージの内部手続き (apply magnitude (list (cons 3 4))) (magnitude (cons 3 4)) ;; 以下のreal-part、imag-partはrectangularパッケージの内部手続き (sqrt (+ (square (real-part (cons 3 4))) (square (imag-part (cons 3 4))))) (sqrt (+ (square 3) (square 4))) (sqrt (+ 9 16)) (sqrt 25) 5
ということで、apply-genericは2回呼び出される。
問題 2.78
修正した部分。
コード
sample.scm
(define (attach-tag type-tag contents) (if (eq? type-tag 'scheme-number) contents (cons type-tag contents))) (define (type-tag datum) (cond ((pair? datum) (car datum)) ((number? datum) 'scheme-number) (error "Bad tagged datum -- TYPE-TAG" datum))) (define (contents datum) (cond ((pair? datum) (cdr datum)) ((number? datum) datum) (error "Bad tagged datum -- CONTENTS" datum)))
問題 2.79、2.80
追加個所のみ。
コード
sample.scm
(define (equ? a b) (apply-generic 'equ? x y)) (define (=zero? x) (apply-generic '=zero? x)) ;; install-scheme-number-package (define (=zero? x) (= x 0)) (put 'equ? '(scheme-number scheme-number) =) (put '=zero? '(scheme-number) =zero?) ;; install-rational-package (define (equ? x y) (and (= (numer x) (numer y)) (= (denom x) (denom y)))) (define (=zero? x) (= (numer x) 0)) (put 'equ? '(rational rational) equ?) (put '=zero? '(rational) =zero?) ;; install-complex-package (define (equ? z1 z2) (and (= (real-part z1) (real-part z2)) (= (imag-part z1) (imag-part z2)))) (define (=zero? z) (= (magnitude z) 0)) (put 'equ? '(complex complex) equ?) (put '=zero? '(complex) =zero?)
0 コメント:
コメントを投稿