問題2.77 – SICP(計算機プログラムの構造と解釈)その87
2009年01月31日
問題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
をデータオブジェクトに渡す。
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542