2008. 8. 4.

연습문제 2.75

(define (make-from-mag-ang x y)
  (define (dispatch op)
    (cond ((eq? op 'magnitude) x)
          ((eq? op 'angle) y)
          ((eq? op 'real-part)
           (* x (cos y)))
          ((eq? op 'imag-part)
           (* y (sin y)))
          (else
           (error "Unknow op -- MAKE-FROM-MAG-ANG" op))))
  dispatch)

연습문제 2.75

(define (make-from-mag-ang x y)
  (define (dispatch op)
    (cond ((eq? op 'magnitude) x)
          ((eq? op 'angle) y)
          ((eq? op 'real-part)
           (* x (cos y)))
          ((eq? op 'imag-part)
           (* y (sin y)))
          (else
           (error "Unknow op -- MAKE-FROM-MAG-ANG" op))))
  dispatch)

연습문제 2.74

앞의 미분식의 도표와 유사하게 데이터가 저장된다고 하면..
가로는 부서, 세로는 일반함수라고 가정하자.

그렇다면 get-record는 다음과 같이 구성할 수 있다.

(define (get-record who-id employer-file)
  ((get 'get-record
        (get-division employer-file))
        who-id (get-file employer-file)))
이제 각 부서파일이 어떤 구조를 갖추어야하는지를 알아보면 각 부서파일은 최소한 두가지, 즉 자신이 어떤 부서인지와, 레코드를 검색할 수 있는 직원이름을 돌려주어야한다.
말하자면 일반적으로 다음과 같은 구조를 최소한 포함하여야한다.

(define (make-generic-file division file) (list division file))

(define (get-division gf) (car gf))
(define (get-file gf) (cadr gf))

b.
(define (get-salary who-id employer-file)
  ((get 'get-salary
        (get-division employer-file))
   who-id (get-file employer-file)))

c.
(define (find-employee-record who-id filelist)
  (lambda (file)
    (get-record who-id) file) filelist)

d. 해당 회사에 따르는 각종 연산자를 새로 구성하고 이를 테이블에 적용시켜야한다.

연습문제 2.74

앞의 미분식의 도표와 유사하게 데이터가 저장된다고 하면..
가로는 부서, 세로는 일반함수라고 가정하자.

그렇다면 get-record는 다음과 같이 구성할 수 있다.

(define (get-record who-id employer-file)
  ((get 'get-record
        (get-division employer-file))
        who-id (get-file employer-file)))
이제 각 부서파일이 어떤 구조를 갖추어야하는지를 알아보면 각 부서파일은 최소한 두가지, 즉 자신이 어떤 부서인지와, 레코드를 검색할 수 있는 직원이름을 돌려주어야한다.
말하자면 일반적으로 다음과 같은 구조를 최소한 포함하여야한다.

(define (make-generic-file division file) (list division file))

(define (get-division gf) (car gf))
(define (get-file gf) (cadr gf))

b.
(define (get-salary who-id employer-file)
  ((get 'get-salary
        (get-division employer-file))
   who-id (get-file employer-file)))

c.
(define (find-employee-record who-id filelist)
  (lambda (file)
    (get-record who-id) file) filelist)

d. 해당 회사에 따르는 각종 연산자를 새로 구성하고 이를 테이블에 적용시켜야한다.

연습문제 2.73

a. 덧셈, 곱셈 및 기타 연산에 대한 미분 함수를 연산 표에 입력시켰다 number?나 variable? 은 연산으로 표시되는 경우와는 구분된다. 이들은 별도로 구분할 연산규칙이 없기때문에 연산 표에 등재할 이유가 없다.

b.

(define (install-deriv-package)
  (define (addend exp) (car exp))
  (define (augend exp) (cadr exp))
  (define (make-sum s1 s2)
    (list '+ s1 s2))
 
  (define (multiplier exp) (car exp))
  (define (multiplicand exp) (cadr exp))
  (define (make-product p1 p2)
    (list '* p1 p2))
 
  (define (deriv-sum exp var)
    (make-sum (deriv (addend exp) var)
              (deriv (augend exp) var)))
 
  (define (deriv-product exp var)
    (make-sum (make-product (multipier exp)
                            (deriv (mltiplicand exp) var))
              (make-product (deriv (multiplier exp) var)
                            (multiplicand exp))))
 
  (put 'deriv '+ deriv-sum)
  (put 'deriv '* deriv-product))
c.

(define (make-exponentiation base exponent)
  (cond ((=number? base 0) 0)
        ((=number? base 1) 0)
        ((=number? exponent 0) 1)
        ((=number? exponent 1) base)
        (else (list '** base exponent))))


(define (base exp)
  (car exp))

(define (exponent exp)
  (cadr exp))

(define (deriv-exponent exp var)
  (make-product (make-product (exponent exp)
                              (make-exponentiation (base exp)
                                                   (- (exponent exp) 1)))))

(put 'deriv '** deriv-exponent)

d. get 과 put을 하는 시스템의 변경은 있을 수 있겠지만, 실제로 이들을 등록하고 사용하는 측면에서는 get과 put에 관련된 루틴이외에는 변경할 필요가 없다.

연습문제 2.73

a. 덧셈, 곱셈 및 기타 연산에 대한 미분 함수를 연산 표에 입력시켰다 number?나 variable? 은 연산으로 표시되는 경우와는 구분된다. 이들은 별도로 구분할 연산규칙이 없기때문에 연산 표에 등재할 이유가 없다.

b.

(define (install-deriv-package)
  (define (addend exp) (car exp))
  (define (augend exp) (cadr exp))
  (define (make-sum s1 s2)
    (list '+ s1 s2))
 
  (define (multiplier exp) (car exp))
  (define (multiplicand exp) (cadr exp))
  (define (make-product p1 p2)
    (list '* p1 p2))
 
  (define (deriv-sum exp var)
    (make-sum (deriv (addend exp) var)
              (deriv (augend exp) var)))
 
  (define (deriv-product exp var)
    (make-sum (make-product (multipier exp)
                            (deriv (mltiplicand exp) var))
              (make-product (deriv (multiplier exp) var)
                            (multiplicand exp))))
 
  (put 'deriv '+ deriv-sum)
  (put 'deriv '* deriv-product))
c.

(define (make-exponentiation base exponent)
  (cond ((=number? base 0) 0)
        ((=number? base 1) 0)
        ((=number? exponent 0) 1)
        ((=number? exponent 1) base)
        (else (list '** base exponent))))


(define (base exp)
  (car exp))

(define (exponent exp)
  (cadr exp))

(define (deriv-exponent exp var)
  (make-product (make-product (exponent exp)
                              (make-exponentiation (base exp)
                                                   (- (exponent exp) 1)))))

(put 'deriv '** deriv-exponent)

d. get 과 put을 하는 시스템의 변경은 있을 수 있겠지만, 실제로 이들을 등록하고 사용하는 측면에서는 get과 put에 관련된 루틴이외에는 변경할 필요가 없다

2008. 8. 1.

연습문제 2.72

패스