comp.lang.ada
 help / color / mirror / Atom feed
From: Victor Porton <porton@narod.ru>
Subject: Re: Type invariants and private extensions?
Date: Wed, 13 Sep 2017 01:59:14 +0300
Date: 2017-09-13T01:59:14+03:00	[thread overview]
Message-ID: <op9os0$1mg$1@gioia.aioe.org> (raw)
In-Reply-To: a0daf913-644d-4438-8acb-0df2ae84de1a@googlegroups.com

Shark8 wrote:

> On Tuesday, September 12, 2017 at 2:09:08 PM UTC-6, Victor Porton wrote:
>> Jeffrey R. Carter wrote:
>> 
>> > 
>> > "I want to" is not the same as "there is no way to solve the problem in
>> > current Ada". Ada has a feature that provides exactly what you need.
>> > It's called a variant record.
>> 
>> It is a tagged type. AFAIK, a type cannot be both a variant record and
>> tagged.
> 
> You certainly can:
> 
>     Type Type_Enumeration is ( TInteger, TReal, TBoolean, Nothing );
>     
>     Type Example( Item_Type : Type_Enumeration ) is tagged record
> case Item_Type is
> when TInteger => I : Integer;
> when TReal    => R : Float range Float'Range;
> when TBoolean => B : Boolean;
> when Nothing  => Null;
> end case;
>     end record;
>     
>> Moreover, the object in consideration is a wrapper over a certain C API.
>> It surely cannot be described in variant record terms.
> 
> Sure it can; there's a reason that there's a separation between
> specification and body, part of which is so you can hide something like an
> interface to C and present something sensible to your program/clients.

Thanks.

But this seems not to solve my problem:

The base type for Example cannot be defined as a discriminated type for 
certain Type_Enumeration, because it is possible that when creating the 
object it may be yet unknown what the value of the discriminant should have 
(my main problem is to invent somethings if this value is known at object 
creation, but we must support the unknown case too). AFAIK, it is not 
possible to change the discriminant later.

The solution would be to define a discriminated type as its descendant, but 
then all problems which I described in previous messages appear again. So 
this is not a solution.

Hm, we can make Type_Enumeration to contain the value "Any" to allow any 
result type. This is formally a solution, but it is against OO principles 
such as the principle that derived types should be made by object 
inheritance. Wait, it has another more important in practice deficiency: 
Example(Any) would be incompatible with Example(TInteger); this seems not 
acceptable.

And variant records are certainly not applicable here, as I deal with 
(tagged) private types which contain a C pointer only.

>> Moreover, bindings may contain more than one row of values which can be
>> enumerated like an iterator. I am not sure if this can be expressed in
>> terms of a variant record.
> 
> Variant records can have discriminants, too. (In fact, discriminants are
> half of how variant-records do their thing, the other half being the
> "internal case statement/construct".)
> 
>> The proposed feature increases reliability of programming. It is
>> undoubtful that adding more type invariants increases reliability.
> 
> I fail to see how you couldn't achieve this by use of (a) variant records,
> and (b) constrained subtypes.
> 
> eg:
>   SubType Integer_Example is Example( TInteger );
>   Function X(Input : Integer) Return Integer_Example;
-- 
Victor Porton - http://portonvictor.org

  reply	other threads:[~2017-09-12 22:59 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-11 19:51 Type invariants and private extensions? Victor Porton
2017-09-11 20:00 ` Egil H H
2017-09-11 20:48   ` Victor Porton
2017-09-11 21:19     ` Egil H H
2017-09-11 21:27       ` Victor Porton
2017-09-11 21:49         ` Egil H H
2017-09-11 22:00           ` Victor Porton
2017-09-11 22:06             ` Egil H H
2017-09-12  7:30             ` Dmitry A. Kazakov
2017-09-11 22:00         ` Jere
2017-09-11 22:02           ` Victor Porton
2017-09-12 18:26             ` Jeffrey R. Carter
2017-09-12 18:54               ` Victor Porton
2017-09-12 19:56                 ` Jeffrey R. Carter
2017-09-12 20:08                   ` Victor Porton
2017-09-12 22:34                     ` Shark8
2017-09-12 22:59                       ` Victor Porton [this message]
2017-09-13  4:21                         ` Jere
2017-09-13  4:28                           ` Jere
2017-09-13  4:34                             ` Jere
2017-09-14 13:52                           ` Victor Porton
2017-09-15  0:48                             ` Jere
2017-09-16 14:22                               ` Victor Porton
2017-09-14  7:28                         ` Shark8
2017-09-14 13:56                           ` Victor Porton
2017-09-14 13:58                             ` Victor Porton
2017-09-11 22:48         ` Shark8
2017-10-02 23:16         ` Randy Brukardt
replies disabled

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