1.3 Registros variantes

        *Mezcla de Uniones, Productos y Enumerado	*Permiten expresar distintas formas para valores de un mismo tipo.   
	*Cada forma puede tener un numero distinto de componentes

Ejemplo: Tipo para representar cuatro clases de figuras type Radio = Float type Lado = Float type Base = Float type Altura = Float data Figura = Circulo Radio

              Cuadrado Lado
              Rectángulo Base Altura
              Punto
              deriving Show

un Circulo : : Figura un Circulo = Circulo 25

un Rectángulo : : Figura un Rectángulo = Rectángulo 10 15

lista Figuras : : [Figura] lista Figuras = [Circulo 15; Cuadrado 3; Rectángulo 5 6]

area : : Figura ! Float área (circulo r) = pi ¤ r ^ 2 área (Cuadrado l) = l ^ 2 area (Rectangulo b h) = b ¤ h área Punto = 0

Registros Variantes Pascal también proporciona otro tipo de estructura de datos a la que se denomina “registros variantes”. Estos registros permiten agrupar diferentes campos de acuerdo al estatus con el que estén asociados.

Los registros variantes son una especie de sentencia “case” dentro de un registro y son muy útiles cuando tenemos ciertos atributos que sabemos de antemano que sólo usaremos en ciertas situaciones.

Los registros variantes ahorran memoria, porque como sólo una de las estructuras debidas dentro de ellos puede usarse a la vez, el compilador sólo necesita reservar memoria para la mayor de ellas (en vez de tener que hacerlo para todos los componentes del registro).

Registros Variantes Esta propiedad de compartición de espacio en memoria es similar a la de los bloques disjuntos en ALGOL. De hecho, también en el caso de los registros variantes se permite el anidamiento.

Por tanto, los registros variantes son muy eficientes y seguros, porque sólo permiten al programador realizar operaciones qe tengan algún significado dentro del contexto dado y que sean permisibles dentro del registro.

Sin embargo, el problema con esta estructura de datos es que no requiere ser inicializada. Esto signi.ca que podríamos tener cualquier valor dentro de un registro variante después de modificar el valor de un campo identificador.

Registros Variantes Este problema se produce porque Pascal (al igual que la mayoría de los lenguajes estructurados) no requiere que se inicialicen las variables al entrar a su entorno.

El acceso a variables no inicializadas puede dar lugar a que se usen valores que fueron dejados previamente en el bloque y que compartían la misma zona de memoria. En el caso de los registros variantes, este valor puede incluso ser de un tipo diferente al esperado.

De hecho, algunos programadores aprovechan este subterfugio de Pascal para violar su sólido sistema de tipos y realizar algún tipo de programación de sistemas.

La raíz del problema es que los registros variantes permiten una forma de “aliasing”, ya que los campos de las diferentes variantes son todos “alias” de las mismas posiciones de memoria.


Google