Ejemplos de la clase 16 ; clase 16 de LPP (25-04-2006) (put (put (put (put (put (put 'real-part 'rectangular real-part-rectangular) 'imag-part 'rectangular imag-part-rectangular) 'magnitude 'rectangular magnitude-rectangular) 'angle 'rectangular angle-rectangular) 'make-from-real-imag 'rectangular make-from-real-imag-rectangular) 'make-from-mag-ang 'rectangular make-from-mag-ang-rectangular) (put (put (put (put (put (put 'real-part 'polar real-part-polar) 'imag-part 'polar imag-part-polar) 'magnitude 'polar magnitude-polar) 'angle 'polar angle-polar) 'make-from-real-imag 'polar make-from-real-imag-polar) 'make-from-mag-ang 'polar make-from-mag-ang-polar) ;; ;; funcion operate ;; (define (operate op obj) (let ((proc (get op (type-tag obj)))) (if proc (proc obj) (error "Unknown operator for type")))) (define (define (define (define (define (real-part z) (operate 'real-part z)) (imag-part z) (operate 'imag-part z)) (magnitude z) (operate 'magnitude z)) (angle z) (operate 'angle z)) (type z) (operate 'type z)) (define (make-from-mag-ang r a) ((get 'make-from-mag-ang 'polar) r a)) (define (make-from-real-imag x y) ((get 'make-from-real-imag 'rectangular) x y)) ;; ;; Por ultimo: paso de mensajes ;; ;; Paquete representacion rectangular (define (make-from-real-imag x y) (lambda (op) Copyright © 2006 Depto. de Ciencia de la Computación e IA, Universidad de Alicante All rights reserved. Ejemplos de la clase 16 (cond ((eq? op 'real-part) x) ((eq? op 'imag-part) y) ((eq? op 'magnitude) (magnitude-from-real-imag x y)) ((eq? op 'angle) (angle-from-real-imag x y)) ((eq? op 'type) 'rectangular) (else (error "Unknown op -- MAKE-FROM-REAL-IMAG" op))))) ;; Paquete representación polar (define (make-from-mag-ang r a) (lambda (op) (cond ((eq? op 'real-part) (real-from-mag-ang r a)) ((eq? op 'imag-part) (imag-from-mag-ang r a)) ((eq? op 'magnitude) r) ((eq? op 'angle) a) ((eq? op 'type) 'polar) (else (error "Unknown op -- MAKE-FROM-REAL-IMAG" op))))) ;; Funciones genericas que funcionan con culauier tipo de datos (define (define (define (define (define (real-part z) (z 'real-part)) (imag-part z) (z 'imag-part)) (magnitude z) (z 'magnitude)) (angle z) (z 'angle)) (type z) (z 'type)) ; ; código que prueba el módulo ; (define z1 (magnitude (angle z1) (define z2 (real-part (imag-part (define z3 (real-part (imag-part (make-from-real-imag 5 10)) z1) (make-from-mag-ang (magnitude z1) (angle z1))) z2) z2) (add-complex z1 z2)) z3) z3) ; ; Estructuras en MzScheme. ; MzScheme es la versión de Scheme que implementa el intérprete DrScheme. ; En MzScheme se introducen estructuras con la forma especial define-struct (define-struct persona (nombre dni)) ; se definen automáticamente las funciones: Page 2 Copyright © 2006 Depto. de Ciencia de la Computación e IA, Universidad de Alicante All rights reserved. Ejemplos de la clase 16 ; make-persona persona? persona-nombre persona-dni (define p1 (make-persona 'pepe '212121212)) (persona? p1) ;-> #t (persona-nombre p1) ;-> pepe (persona-dni p1) ;-> 212121212 ; Aplicado a números complejos: definimos la estructura complex-rect (define-struct complex-rect (real imag)) ; se definen automáticamente las funciones: ; make-complex-rect, complex-rect?, complex-rect-real y complex-rect-imag (define c1 (make-complex-rect 5 3)) (complex-rect-real c1) -> 5 (complex-rect-imag c1) -> 3 ; definimos las funciones que obtienen la magnitud y el ángulo (define (complex-rect-mag z) (magnitude-from-real-imag (complex-rect-real z) (complex-rect-imag z))) (define (complex-rect-ang z) (angle-from-real-imag (complex-rect-real z) (complex-rect-imag z))) (complex-rect-mag c1) -> 5.830951894845301 (complex-rect-ang c1) -> 0.5404195002705842 ; ; definimos ahora la estructura complex-polar ; (define-struct complex-polar (mag ang)) ; se definen automáticamente las funciones: ; make-complex-polar, complex-polar-mag y complex-polar-ang (define (complex-polar-real z) (real-from-mag-ang (complex-polar-mag z) (complex-polar-ang z))) (define (complex-polar-imag z) (imag-from-mag-ang (complex-polar-mag z) (complex-polar-ang z))) ; ejemplos de uso (define c2 (make-complex-polar 5.830951894845301 0.5404195002705842)) (complex-polar-real c2) -> 5.0 (complex-polar-imag c2) -> 3.0000000000000004 Page 3 Copyright © 2006 Depto. de Ciencia de la Computación e IA, Universidad de Alicante All rights reserved.