(define module '*bidon*) (define method? procedure?) (define creer-rectangulaire (letrec ((rayon (lambda (self) (let ((r (partie-reelle self)) (i (partie-imaginaire self))) (sqrt (+ (* r r) (* i i)))))) (theta (lambda (self) (atan (partie-imaginaire self) (partie-reelle self)))) (add (lambda(self c2) (creer-rectangulaire (+ (partie-reelle self) (partie-reelle c2)) (+ (partie-imaginaire self) (partie-imaginaire c2))))) (sub (lambda(self c2) (creer-rectangulaire (- (partie-reelle self) (partie-reelle c2)) (- (partie-imaginaire self) (partie-imaginaire c2))))) (mul (lambda(self c2) (creer-polaire (* (module self) (module c2)) (+ (angle self) (angle c2))))) (divi (lambda(self c2) (creer-polaire (/ (module1 self) (module c2)) (- (angle self) (angle c2)))))) (lambda (x y) (lambda(m) (cond ;; partie pour créer les sélecteurs ((eq? m 'partie-reelle) (lambda(self) x)) ((eq? m 'partie-imaginaire) (lambda(self) y)) ((eq? m 'partie-module) rayon) ((eq? m 'partie-angle) theta) ;; partie pour créer les opérations ((eq? m '+c) add) ((eq? m '-c) sub) ((eq? m '*c) mul) ((eq? m '/c) divi) ;; utilité ((eq? m 'display) (lambda (self) (display (format "(~s+~si)" x y)))) (else (no-method 'rectangulaire))))))) ;; On redéfinit partie-reelle, partie-imaginaire, module, angle, +c, -c, *c et /c de manière suivante : (define (partie-reelle z) ((z 'partie-reelle) z)) (define (partie-imaginaire z) ((z 'partie-imaginaire) z)) (define (partie-angle z) ((z 'partie-angle) z)) (define (partie-module z) ((z 'partie-module) z)) (define (+c z1 z2) ((z1 '+c) z1 z2)) (define (-c z1 z2) ((z1 '-c) z1 z2)) (define (*c z1 z2) ((z1 '*c) z1 z2)) (define (/c z1 z2) ((z1 '/c) z1 z2)) (define (displayZ z1) ((z1 'display) z1)) (define z1 (creer-rectangulaire 3 4)) (define z2 (creer-rectangulaire 1 2)) (partie-module z1) (partie-reelle (+c z1 z2)) (displayZ z1)