問題2.79 – SICP(計算機プログラムの構造と解釈)その89

問題2.79

各算術演算パッケージに equ? 手続きとインターフェースを追加する。

;; 通常(ordinary)の算術演算パッケージに equ? を追加
  (put 'equ? '(scheme-number scheme-number)
       (lambda (x y) (= x y)))


;; 有理数算術演算パッケージ equ? を追加
  (define (equ-rat? x y)
    (and (= (numer x) (numer y)) (= (denom x) (denom y))))
  (put 'equ? '(rational rational)
       (lambda (x y) (equ-rat? x y)))


;; 複素数算術演算パッケージに equ? を追加
  (define (equ-complex? z1 z2)
    (and (= (real-part z1) (real-part z2))
         (= (imag-part z1) (imag-part z2))))
  (put 'equ? '(complex complex)
       (lambda (z1 z2) (equ-complex? z1 z2)))

汎用算術演算手続きに equ? 手続きを登録する。

(define (equ? x y) (apply-generic 'equ? x y))

実行結果

(equ? (make-scheme-number 2) (make-scheme-number 3))
gosh> #f
(equ? (make-scheme-number 2) (make-scheme-number 2))
gosh> #t
(equ? (make-scheme-number 3) (add (make-scheme-number 2) (make-scheme-number 1)))
gosh> #t

(equ? 2 3)
gosh> #f
(equ? 2 2)
gosh> #t
(equ? 3 (add 2 1))
gosh> #t

(equ? (make-rational 1 2) (make-rational 2 3))
gosh> #f
(equ? (make-rational 1 2) (make-rational 1 2))
gosh> #t
(equ? (make-rational 1 2) (make-rational 2 4))
gosh> #t

(equ? (make-complex-from-real-imag 1 2) (make-complex-from-real-imag 2 3))
gosh> #f
(equ? (make-complex-from-real-imag 1 2) (make-complex-from-real-imag 1 2))
gosh> #t
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»