From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=unavailable autolearn_force=no version=3.4.4 X-Received: by 10.129.82.17 with SMTP id g17mr10616957ywb.205.1505276888920; Tue, 12 Sep 2017 21:28:08 -0700 (PDT) X-Received: by 10.36.121.71 with SMTP id z68mr77181itc.4.1505276888746; Tue, 12 Sep 2017 21:28:08 -0700 (PDT) Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!feeder.eternal-september.org!paganini.bofh.team!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!peer01.iad!feed-me.highwinds-media.com!news.highwinds-media.com!q8no3154943qtb.0!news-out.google.com!c139ni536itb.0!nntp.google.com!o200no659442itg.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: comp.lang.ada Date: Tue, 12 Sep 2017 21:28:08 -0700 (PDT) In-Reply-To: <4565e696-3294-4c27-a761-d18eccb1e1e1@googlegroups.com> Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=173.71.208.22; posting-account=QF6XPQoAAABce2NyPxxDAaKdAkN6RgAf NNTP-Posting-Host: 173.71.208.22 References: <364ff8e0-c7dd-4980-b19f-5d438edd8353@googlegroups.com> <7df81b3c-1fde-4395-8b9b-1a945820a7f7@googlegroups.com> <4565e696-3294-4c27-a761-d18eccb1e1e1@googlegroups.com> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <1003d4d6-dfb0-43c0-93fc-dd81e56e5e8c@googlegroups.com> Subject: Re: Type invariants and private extensions? From: Jere Injection-Date: Wed, 13 Sep 2017 04:28:08 +0000 Content-Type: text/plain; charset="UTF-8" X-Received-Bytes: 5295 X-Received-Body-CRC: 4111246804 Xref: news.eternal-september.org comp.lang.ada:48094 Date: 2017-09-12T21:28:08-07:00 List-Id: On Wednesday, September 13, 2017 at 12:21:12 AM UTC-4, Jere wrote: > On Tuesday, September 12, 2017 at 6:59:17 PM UTC-4, Victor Porton wrote: > > 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. > > > > I may be misunderstanding what you are looking for, but you can > make discriminant types unconstrained to let you choose the type > at run time: > > Type Type_Enumeration is ( TInteger, TReal, TBoolean, Nothing ); > > Type Example( Item_Type : Type_Enumeration := Nothing) 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; > > Then all you have to do is declare an object with no > specified discriminant: > > Some_Object : Example; --notice no discriminant > > In Ada, when you do this, you are able to assign new versions > of the type (with different discriminants: > > Some_Integer : Example := (Item_Type => TInteger, I => 100); > Some_Float : Example := (Item_Type => TFloat, F => 20.2); > > Some_Object := Some_Integer; > Some_Object := Some_Float; > > That's just a play example, you can handle building them however > you want at run time. Sorry, TFloat should be TReal and F should be R Also, I didn't realize this, but you can't do the default value with a tagged type unless it is limited so it would need to be untagged: Type Example( Item_Type : Type_Enumeration := Nothing) is 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; If you are selecting the type via enum, does it still need to be tagged at this point?