comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Discriminant of a limited type object
Date: Thu, 1 Mar 2018 09:43:03 +0100
Date: 2018-03-01T09:43:03+01:00	[thread overview]
Message-ID: <p78een$1jfi$1@gioia.aioe.org> (raw)
In-Reply-To: p77csu$4i8$1@franka.jacob-sparre.dk

On 01/03/2018 00:10, Randy Brukardt wrote:
> "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> wrote in message
> news:p74nge$1oto$1@gioia.aioe.org...
> ...
>> The problem is passing state between calls to the function. The code in
>> mind is a loop over array elements. The loop body gutted and its parts
>> moved into the function.
>>
>>     A : T (1..N);
>> begin
>>     for Index in A'Range loop
>>        do-init of A (Index)
>>     end loop;
>>
>>          |
>>          V
>>
>>     Index : Positive := 1;
>>     function F return Element is
>>     begin
>>        Index := Index + 1;
>>        return do-init of A (Index - 1);
>>     end F;
>>     A : T (1..N) := (others => F)
>>
>> Quite ugly. In the end I decided to flatten record variants and make the
>> discriminant a plain record member. The memory loss is not big enough to
>> justify the code above.
> 
> Ada 2020 has you covered:
> 
>      function F(Index : Natural) return Element is
>      begin
>         return do-init of A (Index - 1);
>      end F;
>      A : T (1..N) := (for I in 1 .. N  => F(I));
> 
> Note the new iterator choice in the aggregate.

Definitely less ugly than recursion. But does this "loop" guarantee that 
F will be called in the order? Say we wanted read an array of limited 
elements from stream:

    function Read (Stream : not null access Root_Stream_Type'Class)
       return Element is
    begin
       return Result : Element (Length => Read (Stream)) do
          Read (Stream.all, Result.Text);
       end return;
    end F;
    A : T (1..N) := (for I in T'Range => Read (File'Access));

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de


  reply	other threads:[~2018-03-01  8:43 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-27 17:54 Discriminant of a limited type object Dmitry A. Kazakov
2018-02-27 22:20 ` Randy Brukardt
2018-02-27 22:53   ` Dmitry A. Kazakov
2018-02-28  6:36     ` J-P. Rosen
2018-02-28  8:42       ` Dmitry A. Kazakov
2018-02-28  9:07         ` J-P. Rosen
2018-02-28 17:16       ` Jeffrey R. Carter
2018-02-28 23:10     ` Randy Brukardt
2018-03-01  8:43       ` Dmitry A. Kazakov [this message]
2018-03-01 22:00         ` Randy Brukardt
2018-03-02 10:30           ` Dmitry A. Kazakov
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox