comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Ada 2005 puzzle
Date: Thu, 12 Jul 2012 18:34:14 +0200
Date: 2012-07-12T18:34:14+02:00	[thread overview]
Message-ID: <1f9q6vk5z2r3t$.1hayo9rmxfwu7$.dlg@40tude.net> (raw)
In-Reply-To: 030cde76-7435-405d-9f12-ac7f730ecab8@googlegroups.com

On Thu, 12 Jul 2012 08:48:05 -0700 (PDT), Adam Beneschan wrote:

> On Thursday, July 12, 2012 5:54:08 AM UTC-7, Dmitry A. Kazakov wrote:
>> Here is a simplified case illustrating an issue with constructing functions
>> and limited aggregates:
>> 
>> -------------------------------------------- package P
>> with Ada.Finalization;
>> package P is
>>    type T (<>) is new Ada.Finalization.Limited_Controlled with private;
>>    function Create return T;
>> private
>>    type T is new Ada.Finalization.Limited_Controlled with null record;
>> end P;
>> - - - - - - - - - - - - - - - - - - - - - - - - 
>> package body P is
>>    function Create return T is
>>    begin
>>       return (Ada.Finalization.Limited_Controlled with null record);
>>    end Create;
>> end P;
>> -------------------------------------------- package Q
>> with P;  use P;
>> package Q is
>>    type S is abstract new T with null record;
>>    type R is new S with null record;
>>    overriding function Create return R;
>> end Q;
>> - - - - - - - - - - - - - - - - - - - - - - - - 
>> package body Q is
>>    function Create return R is
>>    begin
>>       return (T'(Create) with null record); -- Error!
>>    end Create;
>> end Q;
>> 
>> Is there a way to implement Create (without compromising the package P)?
> 
> Well, there seem to be a couple bogus things about your example: (1) your
> extension aggregate in Q doesn't have any additional components,

Of course it does not work with components too. Actually it never works if
the depth of types hierarchy >2. Initially I thought that the problem is
because there was an abstract type in between.

> and (2) the title of your post is "Ada 2005 puzzle".

Sorry for "puzzle." It is just because there is no way to know in advance
if it will be possible to create objects of a derived limited type using
the constructing function of the/a parent.

Furthermore inventing an "aggregate" for a limited type with ancestors is
always a challenge with about 70% chances to lose.

> However, if you were to make R (or S) a type extension with at least one
> new component, rather than a null extension, there would be a problem.

Thus with components it is impossible per language design?

The motivation of the example is enforcing initialization (with parameters)
on a limited ancestor type. I gather, from your post, that this is
fundamentally impossible in Ada.

So far it was somehow possible in Ada 2005, with, as I said 30% chances of
success.

> If this is a real issue (and not simply a hypothetical one), then maybe
> ARG would be open to a proposed change like this.

Well, it is an on-going battle of finding a work-around with least losses.
Because the problem appears only later in other packages, when the train
already left the station.

(I never doubted that limited aggregates were broken, but I didn't think
that nobody intended them to work.)

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



  reply	other threads:[~2012-07-12 16:34 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-12 12:54 Ada 2005 puzzle Dmitry A. Kazakov
2012-07-12 15:48 ` Adam Beneschan
2012-07-12 16:34   ` Dmitry A. Kazakov [this message]
2012-07-19  6:53     ` Randy Brukardt
2012-07-19  7:55       ` Dmitry A. Kazakov
2012-07-20  2:22         ` Randy Brukardt
2012-07-20  7:20           ` Dmitry A. Kazakov
2012-07-21  0:04             ` Randy Brukardt
2012-07-21  8:34               ` Dmitry A. Kazakov
2012-07-24  2:38                 ` Randy Brukardt
2012-07-24  4:23                   ` Adam Beneschan
2012-07-24  7:54                     ` Dmitry A. Kazakov
2012-07-25 23:39                       ` Randy Brukardt
2012-07-26  7:41                         ` Dmitry A. Kazakov
2012-07-26 13:08                           ` Simon Wright
2012-07-26 13:55                             ` Dmitry A. Kazakov
2012-07-27  9:42                               ` AdaMagica
2012-07-27 10:32                                 ` Dmitry A. Kazakov
2012-07-27 11:58                                   ` Georg Bauhaus
2012-07-27 13:04                                     ` Dmitry A. Kazakov
2012-07-28  9:48                                       ` AdaMagica
2012-07-28 10:37                                         ` Dmitry A. Kazakov
2012-07-28 16:59                                           ` AdaMagica
2012-07-28 18:21                                             ` Dmitry A. Kazakov
2012-07-19  8:04       ` Maciej Sobczak
     [not found]         ` <juaghb$fv9$1@munin.nbi.dk>
2012-07-20  7:30           ` Dmitry A. Kazakov
2012-07-21 17:21             ` Vasiliy Molostov
2012-07-21 19:03               ` Dmitry A. Kazakov
2012-07-21 19:37                 ` Vasiliy Molostov
2012-07-21 20:23                   ` Dmitry A. Kazakov
2012-07-21 20:53                     ` Vasiliy Molostov
2012-07-22  7:41                       ` Dmitry A. Kazakov
2012-07-22  8:00                         ` Vasiliy Molostov
2012-07-22  8:19                           ` Dmitry A. Kazakov
2012-07-22  9:06                             ` Vasiliy Molostov
2012-07-22  9:34                               ` Dmitry A. Kazakov
2012-07-20  8:09           ` Maciej Sobczak
2012-07-20  8:27             ` Dmitry A. Kazakov
2012-07-20 11:30               ` Maciej Sobczak
2012-07-20 12:49                 ` Dmitry A. Kazakov
2012-07-21 22:46                   ` Maciej Sobczak
2012-07-22  8:03                     ` Dmitry A. Kazakov
2012-07-22 10:08               ` Florian Weimer
2012-07-22 11:18                 ` Dmitry A. Kazakov
2012-07-21  0:12             ` Randy Brukardt
2012-07-22  9:52       ` Florian Weimer
replies disabled

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