Instanciación de unidades genéricas

Explicación

Las unidades genéricas representan una plantilla mediante la cual se indica al compilador cómo poder crear (en distintas situaciones configuradas por los parámetros) unidades no genéricas que responden al mismo funcionamiento general. De esta forma, las unidades genéricas no se usan directamente, sino sólo para crear instancias no genéricas a partir de ellas. Para crear una instancia de una unidad genérica hay que especificar un nombre para la unidad no genérica que el compilador va a construir y los parámetros reales genéricos a utilizar en el lugar de los formales.

Los parámetros reales genéricos se corresponden con los formales por posición, o por nombre si se utiliza el símbolo "=>". No es necesario proporcionar parámetros reales para los formales que tengan un valor por defecto (cuando sea adecuado para el propósito de la instancia).

Sintaxis

generic_instantiation ::=
    package defining_program_unit_name is
      new generic_package_name [generic_actual_part];
  | [overriding_indicator]
    procedure defining_program_unit_name is
      new generic_procedure_name [generic_actual_part];
  | [overriding_indicator]
    function defining_designator is
      new generic_function_name [generic_actual_part];

generic_actual_part ::=
   (generic_association {, generic_association})

generic_association ::=
   [generic_formal_parameter_selector_name =>] explicit_generic_actual_parameter
 

explicit_generic_actual_parameter ::= expression | variable_name
  | subprogram_name | entry_name | subtype_mark
  | package_instance_name

Ejemplo

Las instancias del siguiente ejemplo están hechas de acuerdo con las declaraciones de unidades genéricas de este otro ejemplo.

type Vector_Ent  is array (Positive range <>) of Integer;
type Vector_Real is array (Integer range <>)  of Float;
procedure Ordenar_Enteros is new Ordenar (Integer, "<", Positive, Vector_Ent);
procedure Ordenar_Reales  is new Ordenar
  (Tipo => Float, "<" => ">", Indice => Integer, Lista => Vector_Real );
package Pila_Palabras is new Pilas (Unbounded_String);