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

問題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 (contents datum)
  (if (pair? datum)
      (cdr datum)
      datum))

(define (attach-tag type-tag contents)
  (if (eq? type-tag 'scheme-number)
      contents
      (cons type-tag contents)))

(add 2 3)
gosh> 5

上の方法では type-tagcontents にあったエラー処理が無くなってしまったので以下のように修正する。

(define (type-tag datum)
  (cond ((number? datum) 'scheme-number)
        ((pair? datum) (car datum))
        (else "Bad tagged datum -- TYPE-TAG" datum)))

(define (contents datum)
  (cond ((number? datum) datum)
        ((pair? datum) (cdr datum))
        (else "Bad tagged datum - CONTENTS" datum)))

(add 2 3)
gosh> 5
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»