이 문제는 2.3.2절에서 본 글자 식의 미분 프로시저를
deriv를 연산, +, *와 같은 연산 기호를 타입으로 하여 고쳤을 때 얘기(?)입니다.

실행을 시키고 싶었지만, put과 get이 기본적으로 제공되지 않아 일단 보류하였습니다.
-> 방법을 찾았습니다.
a.
위에서 한 일은 타입에 따라 연산 프로시저를 반환하도록 하였습니다.
그리고 왜 number?, variable?, same-variable?과 같은 프로시저를 못 바꿨냐하면
해당 프로시저가 받는 인자는 연산 기호가 아니라 대수식 자체입니다.
따라서 바꿀 수 없습니다.
b.
이것은 소스에 적었습니다.
c.
이것 역시 소스에 적었습니다.
d.
((get (operator exp) 'deriv) (operands exp) var)
위와 같은 코드로 바뀌게 된다면 단순히 put에서 자리만 바꾸면 됩니다.
왜냐하면 표에서 행과 열이 바뀌었다고 생각하면 되기 때문입니다.
PS - 2008/02/27 08:30
해당 프로시저를 돌리는 방법을 찾았습니다.
http://eli.thegreenplace.net/2007/09/09/sicp-section-24/
위 사이트에서 hash-table을 써서 put과 get 프로시저를 만들었습니다.
그 곳에 있는 것을 그대로 가져와 실행시키니 잘 되더군요.^^

결과도 깔끔합니다.^^
밑에 적는 소스는 새 것으로 교체하였습니다.
참조
해럴드 애빌슨, 김재우 역, <컴퓨터 프로그램의 구조와 해석>, 인사이트, 2007, pp. 240
; put/get
; http://eli.thegreenplace.net/2007/09/09/sicp-section-24/
;; Operation, type -> procedure
;; Dispatch table.
;;
(define *op-table* (make-hash-table 'equal))
(define (put op type proc)
(hash-table-put! *op-table* (list op type) proc))
(define (get op type)
(hash-table-get *op-table* (list op type) '()))
; SECTION 2.3.2
(define (variable? x) (symbol? x))
(define (same-variable? v1 v2)
(and (variable? v1) (variable? v2) (eq? v1 v2)))
(define (=number? exp num)
(and (number? exp) (= exp num)))
; exercise 2.73
(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))
; b
(define (install-deriv-package)
; 프로시저
(define (make-sum a1 a2)
(cond ((=number? a1 0) a2)
((=number? a2 0) a1)
((and (number? a1) (number? a2)) (+ a1 a2))
(else (list '+ a1 a2))))
(define (make-product m1 m2)
(cond ((or (=number? m1 0) (=number? m2 0)) 0)
((=number? m1 1) m2)
((=number? m2 1) m1)
((and (number? m1) (number? m2)) (* m1 m2))
(else (list '* m1 m2))))
(define (addend s) (car s))
(define (augend s) (cadr s))
(define (multiplier p) (car p))
(define (multiplicand p) (cadr p))
(define (deriv-sum exp var)
(make-sum (deriv (addend exp) var)
(deriv (augend exp) var)))
(define (deriv-product exp var)
(make-sum
(make-product (multiplier exp)
(deriv (multiplicand exp) var))
(make-product (deriv (multiplier exp) var)
(multiplicand exp))))
; 인터페이스
(put 'deriv '+ deriv-sum)
(put 'deriv '* deriv-product))
; c
(define (install-deriv-exponentiation-package)
; 프로시저
(define (base s) (car s))
(define (exponent s) (cadr s))
(define (make-exponentiation b e)
(cond ((=number? b 0) 0)
((=number? e 1) b)
(else (list '** b e))))
(define (make-product m1 m2)
(cond ((or (=number? m1 0) (=number? m2 0)) 0)
((=number? m1 1) m2)
((=number? m2 1) m1)
((and (number? m1) (number? m2)) (* m1 m2))
(else (list '* m1 m2))))
(define (deriv-exponentiation exp var)
(make-product
(exponent exp)
(make-product
(make-exponentiation (base exp) (- (exponent exp) 1))
(deriv (base exp) var))))
; 인터페이스
(put 'deriv '** deriv-exponentiation))
; execute
(install-deriv-package)
(install-deriv-exponentiation-package)
(deriv '(+ x 3) 'x) ; x+3
(deriv '(* x y) 'x) ; x*y
(deriv '(* (* x y) (+ x 3)) 'x) ; x*y * (x+3)
(deriv '(+ (* 3 (** x 3)) (* x 2)) 'x) ; 3x^3 + 2x
- SICP Exercise 연습문제 2.76 (0)2008/02/26
- SICP Exercise 연습문제 2.75 (0)2008/02/26
- SICP Exercise 연습문제 2.74 (0)2008/02/26
- SICP Exercise 연습문제 2.73 (0)2008/02/26
- SICP Exercise 연습문제 2.72 (0)2008/02/25
- SICP Exercise 연습문제 2.71 (0)2008/02/25
- SICP Exercise 연습문제 2.70 (0)2008/02/25
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.







댓글을 달아 주세요