Ejemplos de la clase 16 - Universidad de Alicante

Anuncio
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.
Descargar