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

問題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)

(magnitude z)

gosh> #<closure (debug:trace-procedure debug:trace-procedure)>
gosh> #<closure (debug:trace-procedure debug:trace-procedure)>
gosh> #<closure (debug:trace-procedure debug:trace-procedure)>
gosh> #<closure (debug:trace-procedure debug:trace-procedure)>
gosh> *** ERROR: No method for these types -- APPLY-GENERIC (magnitude (complex))
Stack Trace:
_______________________________________
  0  apply

  1  apply

CALL magnitude (complex rectangular 3 . 4)
 CALL apply-generic magnitude (complex rectangular 3 . 4)
  CALL type-tag (complex rectangular 3 . 4)
  RETN type-tag complex
  CALL get magnitude (complex)
  RETN get #f
gosh>

complex パッケージには タイプタグ complex がついた magnitude 手続きは無いとエラーがでる。

続いて、複素数の選択肢を complex パッケージに追加して式 (magnitude z) を評価した場合をトレースしてみる。

gosh> #<closure (debug:trace-procedure debug:trace-procedure)>
gosh> #<closure (debug:trace-procedure debug:trace-procedure)>
gosh> #<closure (debug:trace-procedure debug:trace-procedure)>
gosh> #<closure (debug:trace-procedure debug:trace-procedure)>
gosh> CALL magnitude (complex rectangular 3 . 4)
 CALL apply-generic magnitude (complex rectangular 3 . 4)
  CALL type-tag (complex rectangular 3 . 4)
  RETN type-tag complex
  CALL get magnitude (complex)
  RETN get #[proc]
  CALL apply-generic magnitude (rectangular 3 . 4)
   CALL type-tag (rectangular 3 . 4)
   RETN type-tag rectangular
   CALL get magnitude (rectangular)
   RETN get #[proc]
  RETN apply-generic 5.0
 RETN apply-generic 5.0
RETN magnitude 5.0
5.0
gosh>

apply-generic は2回呼び出される、まず complex タグの付いた演算名 magnitude をデータオブジェクトに渡し、続いて rectangular タグの付いた演算名 magnitude をデータオブジェクトに渡す。

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