2.3.2 Example: Symbolic Differentiation

http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-16.html#%_sec_2.3.2

記号微分。この辺、個人的には嫌いじゃない。

問題 2.56

指数関数の導入。

; 構成子
(define (make-exponentiation base exponent)
  (cond ((=number? exponent 0) 1)
		((=number? exponent 1) base)
		(else (list '** base exponent))))
; 選択子
(define (exponentiation? x)
  (and (pair? x) (eq? (car x) '**)))
(define (base s) (cadr s))
(define (exponent s) (caddr s))

; deriv関数(変更分のみ)
		((exponentiation? exp)
		 (make-product
		  (make-product
		   (exponent exp)
		   (make-exponentiation (base exp) (- (exponent exp) 1)))
		  (deriv (base exp) var)))
問題 2.57

3項以上扱えるようにするやつ。

; 加算の選択子
(define (augend s) 
  (if (= (length s) 3)
	  (caddr s)
	  (cons '+ (cddr s))))

; 乗算の選択子
(define (multiplicand p) 
  (if (= (length p) 3)
	  (caddr p)
	  (cons '* (cddr p))))
問題2.58

中置演算子を解釈する。
方法は色々あると思うが、ぼくはParser方式で。でも、2項演算子でギブ。残りは、SICP Liteで。

(define (parser exp)
  (cond ((symbol? exp) exp)
	     ((number? exp) exp)
	     ((eq? (car exp) '+) exp)
	     ((eq? (car exp) '*) exp)
	     ((= (length exp) 3)
	       (list (cadr exp) (parser (car exp)) (parser (caddr exp))))
	     (else 
	       (error "Not implemented when parsing generic expression"))))