1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
;;DATA DIRECTED PROGRAMMING
;;INSTAL RECTANGULAR PACKAGE
(define install-rectangular-package)
;;; internal procedures
(define (make-from-rect x y) (cons x y))
(define (real-part z) (car z))
(define (imag-part z) (cdr z))
(define (angle z) (atan (cdr z) (car z)))
(define (magnitude z)
(sqrt (+ (square (car z))
(square (cdr z)))))
(define (make-from-polar r a)
(cons (* r (cos a)) (* r (sin a))))
;;; interfacing
(define (tag x) (attach-type 'rectangular x)
(put 'real-part '(rectangular) real-part)
(put 'imag-part '(rectangular) imag-part)
(put 'magnitude '(rectangular) magnitude)
(put 'angle '(rectangular) angle)
(put 'make-from-rect 'rectangular
(lambda (x y)
(tag (make-from-rect x y))))
(put 'make-from-polar 'rectangular
(lambda (x y)
(tag (make-from-polar x y))))
'done)
;;DATA DIRECTED PROGRAMMING
;;INSTALL POLAR PACKAGE
(define install-polar-package)
;;; internal procedures
(define (make-from-polar r a) (cons r a))
(define (angle z) (car z))
(define (magnitude z) (cdr z))
(define (real-part z) (* (car z) (cos (cdr z))))
(define (imag-part z) (* (car z) (sin (cdr z))))
(define (make-from-rect x y)
(cons (sqrt (+ (square x) (square y)))
(atan y x)))
;;; interfacing
(define (tag x) (attach-type 'polar x)
(put 'real-part '(polar) real-part)
(put 'imag-part '(polar) imag-part)
(put 'magnitude '(polar) magnitude)
(put 'angle '(polar) angle)
(put 'make-from-rect 'polar
(lambda (x y)
(tag (make-from-rect x y))))
(put 'make-from-polar 'polar
(lambda (x y)
(tag (make-from-polar x y))))
'done)
;;APPLY OPERATORS
(define (apply-generic op . args)
(let ((types (map type args))) ;; type est la fonction qui renvoi à partir
;; d'un objet 'taggé' le tag (enfin c'est
;; ce que je suppose car défini ainsi
;; précédemment)
(let ((proc (get op types)) )
(if proc
(apply proc (map contents args))
(error "operator not defined on these types
-- APPLY-GENERIC" (list op types))
(define (real-part z)
(apply-generic 'real-part z))
(define (imag-part z)
(apply-generic 'imag-part z))
(define (magnitude z)
(apply-generic 'magnitude z))
(define (angle z)
(apply-generic 'angle z))
(define (make-from-rect x y)
((get 'make-from-rect 'rectangular) x y))
(define (make-from-polar r a)
((get 'make-from-polar 'polar) r a)) |
Partager