微分する関数として以前こんなのを書かされた。
(define (deriv exp var) (cond ((number? exp) 0) ((variable? exp) (if (same-variable? exp var) 1 0)) ((sum? exp) (make-sum (deriv (addend exp) var) (deriv (augend exp) var))) ((product? exp) (make-sum (make-product (multiplier exp) (deriv (multiplicand exp) var)) (make-product (deriv (multiplier exp) var) (multiplicand exp)))) <more rules can be added here> (else (error "unknown expression type -- DERIV" exp))))
でもこういう形だと、割り算についての微分を加えるときとか、引き算についての微分を加えるときとかたいへんです><
そこで、以下のようにして、足し算についての微分とかを行う関数をモジュールみたくテーブルに登録して、足し算を微分するとき、引き算を微分するときなど、必要な関数をgetで自動的に取り出すようにすればいいじゃんと、そういう話。data-directed programmingとかいうらしい。
(define (deriv exp var) (cond ((number? exp) 0) ((variable? exp) (if (same-variable? exp var) 1 0)) (else ((get 'deriv (operator exp)) (operands exp) var)))) (define (operator exp) (car exp)) (define (operands exp) (cdr exp))
a. 上記コードはなにしてんの。なんでnumer?とかvariable?とかは統合できないの。
関数に演算に対する微分の仕方を書き加えていくんじゃなくて、``微分の仕方''をテーブルから取り出すような形に変えてる。そしたら、新しい``式に対する微分''を加えるときもテーブルに登録してやれば、derivをいじらなくてもよくなって世界が平和になるし、病気は治るし、温暖化は止まる。
number?とかが統合できないのは、オペレータがないから。テーブルをルックアップすることができない。