Oh, ok.
This is actually easy, at least once you understand that Strings are just arrays, unconstrained arrays, but arrays nonetheless.
For illustration-purposes, we’re going to use non-string arrays to explain what’s going on.
Type Vector is Array (Positive range <>) of Natural;
-- Returns a vector from user-input.
Function Prompt return Vector is
Empty : Constant Vector(2..1):= (others => 1);
Function Collect( Result : in Vector := Empty ) return Vector is
Begin
Ada.Text_IO.Put_Line( "Enter a natural number (Negative to exit): " );
Declare
Input : String renames Ada.Text_IO.Get_Line;
Value : Integer renames Natural'Val( Input );
Begin
Return Collect( Result & Value );
End;
Exception
when Constraint_Error => Return Result;
End Collect;
Begin
Return Collect;
End Prompt;
Data_Set : Vector:= Prompt;
Now, Data_Set is unconstrained by its subtype and must be constrained by the initialization, which here is Prompt. Since Prompt returns an unconstrained array, it can be any length from 0 to its full index.
So, having constrained Data_Set with the initial value, while it is variable, the size is fixed, meaning you could have (1,4,7,5) and change it to (9,3,7,1), but not (7,7) or (2,3,3,1,8).
The other way to constrain a value would be like Data_Set_2 : Vector(2..7):= (others => 7);, which creates a length-5 vector and filling its elements with 7.
Now, we come to the syntactic sugar for Strings – Strings are merely arrays which have an element which is a character-type (meaning an enumeration having at least one element surrounded by single quotes) – the syntactic sugar allows you to say "Hello" instead of write ('H','e','l','l','o').
Three questions:
- How do I do this with unbounded strings?
- How do I do this with bounded strings?
- Are there any other ways to do this I should be aware of?
I typically do something like:
Function "+"(Right : String) return Ada.Strings.Unbounded_Strings.Unbounded_String renames Ada.Strings.Unbounded_Strings.To_Unbounded_String;
Function "+"(Right : Ada.Strings.Unbounded_Strings.Unbounded_String) return String renames Ada.Strings.Unbounded_Strings.To_String;
--...
X : Unbounded_String:= +"Initial stuff."'
X:= X & (+"Other stuff");
--...
Return Result : String:= +X;
Which you can pretty much do with bounded as well.