Records con discriminantes y partes variantes

Explicación

Se pueden definir records que tengan parámetros discriminantes, que son componentes del propio record que pueden usarse para condicionar la existencia o características de otros componentes. Un record con partes variantes (variant_part) tiene diferentes componentes en función del valor de del discriminante (discreto) que se utilice para discriminar la parte variante.

Sintaxis

known_discriminant_part ::= 
   (discriminant_specification {; discriminant_specification})

discriminant_specification ::= 
    defining_identifier_list : [null_exclusion] subtype_mark [:= expression]
  | defining_identifier_list : access_definition [:= expression]

variant_part ::= 
   case discriminant_direct_name is
      variant
     {variant}
   end case;

variant ::= 
   when discrete_choice_list =>
      component_list

discrete_choice_list ::= discrete_choice {| discrete_choice}

discrete_choice ::= expression | discrete_range | others

discrete_range ::= discrete_subtype_indication | rango

Ejemplo

type Matriz_Base is array (Integer range <>, Integer range <>) of Float;
--  Record con dos discriminantes (Filas y Columnas)
type Matriz (Filas, Columnas: Positive) is record
   Valores : Matriz_Base (1 .. Filas, 1 .. Columnas);
end Matriz;
type Figura is (Rectángulo, Círculo);

--  Record con parte variante
type Polígono (Forma : Figura) is record --  Forma es el discriminante
   Pos_X, Pos_Y: Float;
   case Forma is   --  Parte variante
      when Rectángulo => Base, Altura: Float;
      when Círculo    => Radio       : Float;
   end case;
end record;

Véase