comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Generic procedures and their parameters
Date: Wed, 6 Sep 2006 16:09:27 +0200
Date: 2006-09-06T16:09:27+02:00	[thread overview]
Message-ID: <oqi8mcqxigz9.u9on46d1iyuu$.dlg@40tude.net> (raw)
In-Reply-To: wcc64g1xi4k.fsf@shell01.TheWorld.com

On 06 Sep 2006 09:02:51 -0400, Robert A Duff wrote:

> "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> writes:
> 
>> On Wed, 06 Sep 2006 10:51:48 +0200, Maciej Sobczak wrote:
>> 
>>> eneric
>>>     type Index_Type   is (<>);
>>>     type Element_Type is private;
>>>     type Array_Type   is array (Index_Type range <>) of Element_Type;
>>>     with function "<" (Left, Right : in Element_Type) return Boolean is <>;
>>> procedure Sort(To_Sort : in out Array_Type);
>>> 
>>> My question is: what's the purpose of the third parameter (Array_Type)? 
>>> Isn't it implied by the first two and therefore just redundant?
>> 
>> Reverse. Actually Index_Type and Element_Type are redundant. In a better
>> Ada it should be:
>> 
>>    generic
>>       type Container_Type is array (<>) of <>;
>>              -- or "(<>) is limited private array"
>>       with function "<" (Left, Right : in Container_Type'Element)
>>          return Boolean is <>;
>>    procedure Sort (To_Sort : in out Container_Type);
>> 
>> [ Even better it be non-generic:
>> 
>>    procedure Sort (To_Sort : in out Container_Of_Ordered'Class);
>> 
>> where each container type (like an array) be a member of the class, if its
>> elements are in Ordered'Class. ]
> 
> I think you mean Sequence_Of_Ordered -- not all containers can be
> sorted.

Right, both the index type and the element types have to be ordered, and
also the element type should be non-limited.

> But I agree that it would be nice to have such a feature.  It works for
> the built-in array types -- you magically get "and" if the component is
> Boolean, "<" if the component is discrete, ":=" if the component is
> non-limited.  I don't know of a good way to do that sort of thing for
> user-defined containers.

The user-defined container should implement the corresponding interface. As
you said, the interface could have two type discriminants (physically type
tags):

Index : type Abstract_Ordered;
Element : type Abstract_Ordered

Because interfaces are MI, an array of Boolean could implement Lattice
interface, which would give the user and, or, not etc. Upon declaration he
would specify the interfaces his container promises to implement.

The problems with that, as I can see:

1. inheritance/overriding/merging of discriminants (diamond diagram).
Clearly Index and Element in all interfaces should be same.

2. an intelligent and effective elimination of statically-known
discriminants at run-time.

BTW, if that worked, we could remove built-in tagged types replacing them
by an interface with the Tag discriminant.

There is another interesting thing to investigate. If a type has many
type-discriminants, then for each such discriminant (including its own
tag), it should have a class. I.e. by analogy with T'First(n) attributes
there will be Container'Class, Contrainer'Class(Index),
Container'Class(Element). That would open a range of possibilities. For
example one could derive from Container along the 'Element' axis. The
result should be a class of containers with elements from Element'Class.

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



  reply	other threads:[~2006-09-06 14:09 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-09-06  8:51 Generic procedures and their parameters Maciej Sobczak
2006-09-06  9:43 ` Dmitry A. Kazakov
2006-09-06 12:36   ` Maciej Sobczak
2006-09-06 13:11     ` Robert A Duff
2006-09-06 14:14       ` Maciej Sobczak
2006-09-06 15:09         ` Dmitry A. Kazakov
2006-09-06 16:35           ` Georg Bauhaus
2006-09-07  7:32             ` Dmitry A. Kazakov
2006-09-07  6:48               ` Georg Bauhaus
2006-09-07 10:19                 ` Dmitry A. Kazakov
2006-09-08  9:11           ` Maciej Sobczak
2006-09-08 10:19             ` Dmitry A. Kazakov
2006-09-09 14:49         ` Robert A Duff
2006-09-09 15:34           ` Dmitry A. Kazakov
2006-09-09 23:26           ` Jeffrey R. Carter
2006-09-10 11:49             ` Robert A Duff
2006-09-10 19:43               ` Jeffrey R. Carter
2006-09-06 13:02   ` Robert A Duff
2006-09-06 14:09     ` Dmitry A. Kazakov [this message]
2006-09-08  3:35   ` Randy Brukardt
2006-09-08  7:21     ` Dmitry A. Kazakov
2006-09-09  1:29       ` Randy Brukardt
2006-09-09  7:14         ` Dmitry A. Kazakov
2006-09-09 14:32         ` Robert A Duff
2006-09-06 12:56 ` Robert A Duff
2006-09-07  2:47 ` Steve
2006-09-07  7:47   ` 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