comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Array slices and types
Date: Thu, 21 Aug 2008 23:30:47 -0500
Date: 2008-08-21T23:30:47-05:00	[thread overview]
Message-ID: <g8lfj6$n53$2@jacob-sparre.dk> (raw)
In-Reply-To: fc112b42-285c-4ed5-ae78-34be4e60f6df@i20g2000prf.googlegroups.com

"Adam Beneschan" <adam@irvine.com> wrote in message 
news:fc112b42-285c-4ed5-ae78-34be4e60f6df@i20g2000prf.googlegroups.com...
> On Aug 21, 1:53 am, "Dmitry A. Kazakov" <mail...@dmitry-kazakov.de>
> wrote:
>> On Thu, 21 Aug 2008 08:26:26 +0300, Niklas Holsti wrote:
>> > But doesn't this example show that it would be useful to have 'Base
>> > also for array types?
>>
>> For any type, actually.
>>
>> Consider this language design fault:
>>
>> procedure Initialize (X : in out S) is
>> begin
>>    Initialize (T (X));
>>    ... -- My stuff
>> end Initialize;
>>
>> A call to Initialize should be done automatically, but it is not. So the
>> parent of S must be explicitly specified and known to all descendant. 
>> This
>> is a really *bad* thing:
>>
>> package Foo is
>>    type S is new T with private;
>> private
>>    type S is new Private_Decendant_Of_T with ...;
>> end Foo;
>>
>> What would happen if Private_Decendant_Of_T overrode Initialize of T? The
>> result would be an inability to publicly derive from S any new types if
>> Initialize should be extended!
>>
>> S'Base could mend it:
>>
>> procedure Initialize (X : in out S) is
>> begin
>>    (S"Base (X)).Initialize; -- Call to parent whatever it be
>>    ... -- My stuff
>> end Initialize;
>
> Sorry, Dmitry, but if you'll pardon the expression, you're a little
> off-base here.  S'Base and S are subtypes of the same *type*.  They
> may be different subtypes (have different constraints), but they're
> the same type.  You're asking for an attribute that would give you a
> different type.  There may be merit in having such an attribute (I
> haven't looked into it closely), but calling it 'Base would be a bad
> idea.  S'Parent might be better.

I tried to propose such a thing for Ada 2005, but it didn't work out. There 
isn't necessarily a single type that is the parent, unless you break 
privacy. Specifically:

    package P is
          type New_Type is new Some_Base with private;
          procedure Some_Operation (Obj : in out New_Type; Parent : in 
New_Type'Parent);
    private
          type New_Type is new Some_Derived with record ...
    end P;

In this case, what does New_Type'Parent give you in the body? We'd want it 
to resolve to Some_Derived. But a client of P can't see the full declaration 
(and shouldn't be able to depend on it), and thus P.New_Type'Parent would 
have to resolve to Some_Base.

So far, we can live with this. But now consider the completion to 
Some_Operation: the body would use the same parameter types in order to 
conform, but the *meaning* of the second parameter would be different to 
clients and the body. Oops. One could ban using this attribute in such 
specs, but that looks like a nasty wart (as bad as the original one). Thus, 
we didn't get a 'Parent attribute.

> Niklas is asking for S'Base to be the unconstrained array subtype of
> the (possibly constrained) array subtype S.  It would still fit into
> the definition of 'Base (3.5(15)).  I'm not sure why this wasn't
> defined for array subtypes, or for any other type that could have
> discriminants; offhand I don't see how this would cause any problems.

It does cause problems, and they're pretty severe as I recall. After all, 
Ada 83 allowed 'Base on everything (but only as a prefix of another 
attribute). That was removed in Ada 95 because of problems. But I can't 
remember what they were precisely. Sorry about that.

                                    Randy.





  parent reply	other threads:[~2008-08-22  4:30 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-20 14:51 Array slices and types Maciej Sobczak
2008-08-20 15:26 ` Niklas Holsti
2008-08-20 15:46 ` Dmitry A. Kazakov
2008-08-20 18:52   ` Niklas Holsti
2008-08-20 20:01     ` Simon Wright
2008-08-21  5:26       ` Niklas Holsti
2008-08-21  8:53         ` Dmitry A. Kazakov
2008-08-21 14:44           ` Adam Beneschan
2008-08-21 15:46             ` Dmitry A. Kazakov
2008-08-22  4:30             ` Randy Brukardt [this message]
2008-08-20 17:47 ` stefan-lucks
2008-08-20 17:51   ` stefan-lucks
2008-08-20 20:45 ` Adam Beneschan
2008-08-21 21:16   ` Maciej Sobczak
2008-08-23  2:50 ` Steve
replies disabled

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