Advanced Array Aggregates
Note
These array aggregates are supported by
GNAT Community Edition 2020
GCC 11
Square brackets
In Ada 2022, you can use square brackets in array aggregates. Using square brackets simplifies writing both empty aggregates and single-element aggregates. Consider this:
pragma Ada_2022; pragma Extensions_Allowed (On); package Show_Square_Brackets is type Integer_Array is array (Positive range <>) of Integer; Old_Style_Empty : Integer_Array := (1 .. 0 => <>); New_Style_Empty : Integer_Array := []; Old_Style_One_Item : Integer_Array := (1 => 5); New_Style_One_Item : Integer_Array := [5]; end Show_Square_Brackets;
Short summary for parentheses and brackets
Record aggregates use parentheses
Container aggregates use square brackets
Array aggregates can use both square brackets and parentheses, but parentheses usage is obsolescent
Iterated Component Association
There is a new kind of component association:
Vector : Integer_Array := [for J in 1 .. 5 => J * 2];
This association starts with for
keyword, just like a quantified
expression. It declares an index parameter that you can use in the
computation of a component.
Iterated component associations can nest and can be nested in another association (iterated or not). Here we use this to define a square matrix:
Matrix : array (1 .. 3, 1 .. 3) of Positive :=
[for J in 1 .. 3 =>
[for K in 1 .. 3 => J * 10 + K]];
Iterated component associations in this form provide both element indices and values, just like named component associations:
Data : Integer_Array (1 .. 5) :=
[for J in 2 .. 3 => J, 5 => 5, others => 0];
Here Data
contains (0, 2, 3, 0, 5)
, not (2, 3, 5, 0, 0)
.
Another form of iterated component association corresponds to a positional component association and provides just values, but no element indices:
Vector_2 : Integer_Array := [for X of Vector => X / 2];
You cannot mix these forms in a single aggregate.
It's interesting that such aggregates were originally proposed more than 25 years ago!
Complete code snippet:
pragma Ada_2022; pragma Extensions_Allowed (On); -- for square brackets with Ada.Text_IO; procedure Show_Iterated_Component_Association is type Integer_Array is array (Positive range <>) of Integer; Old_Style_Empty : Integer_Array := (1 .. 0 => <>); New_Style_Empty : Integer_Array := []; Old_Style_One_Item : Integer_Array := (1 => 5); New_Style_One_Item : Integer_Array := [5]; Vector : constant Integer_Array := [for J in 1 .. 5 => J * 2]; Matrix : constant array (1 .. 3, 1 .. 3) of Positive := [for J in 1 .. 3 => [for K in 1 .. 3 => J * 10 + K]]; Data : constant Integer_Array (1 .. 5) := [for J in 2 .. 3 => J, 5 => 5, others => 0]; Vector_2 : constant Integer_Array := [for X of Vector => X / 2]; begin Ada.Text_IO.Put_Line (Vector'Image); Ada.Text_IO.Put_Line (Matrix'Image); Ada.Text_IO.Put_Line (Data'Image); Ada.Text_IO.Put_Line (Vector_2'Image); end Show_Iterated_Component_Association;