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=-0.1 required=5.0 tests=BAYES_00,FORGED_GMAIL_RCVD, FREEMAIL_FROM,PP_MIME_FAKE_ASCII_TEXT autolearn=no autolearn_force=no version=3.4.4 X-Google-Thread: 103376,c469fdacc2f3302b X-Google-NewGroupId: yes X-Google-Attributes: gida07f3367d7,domainid0,public,usenet X-Google-Language: ENGLISH,ASCII Path: g2news2.google.com!news4.google.com!feeder.news-service.com!188.40.43.213.MISMATCH!feeder.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: Warren Newsgroups: comp.lang.ada Subject: Re: Dynamic Variant Record Creation Date: Tue, 16 Mar 2010 20:01:20 +0000 (UTC) Organization: A noiseless patient Spider Message-ID: References: Injection-Date: Tue, 16 Mar 2010 20:01:20 +0000 (UTC) Injection-Info: feeder.eternal-september.org; posting-host="9f8M0iN5t54V+4DF/iqO8g"; logging-data="27438"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/3Ky6S5Gu1Yb0lXT+BC7Q5xUQZ/W31DyA=" User-Agent: Xnews/5.04.25 X-Face: &6@]C2>ZS=NM|HE-^zWuryN#Z/2_.s9E|G&~DRi|sav9{E}XQJb*\_>=a5"q]\%A;5}LKP][1mA{gZ,Q!j Cancel-Lock: sha1:0qUMC8+rofvFxa/s7hD+XbTAQXA= Xref: g2news2.google.com comp.lang.ada:10572 Date: 2010-03-16T20:01:20+00:00 List-Id: Adam Beneschan expounded in news:c3fa9a0f-99c7-4fff-9310-7e4d769065db@s25g2000prd.googlegroups.com: > On Mar 16, 10:11�am, Warren wrote: >> I am trying to solve a lexer Ada design problem, using a >> variant record (Token_Unit) definition: >> >> � � type Token_Type is ( >> � � � � LEX_000, >> � � � � LEX_BINARY, >> � � � � ...etc... >> � � � � LEX_EOF >> � � ); >> >> � � type Token_Unit(Token : Token_Type := LEX_EOF) is >> � � � � record ... >> � � � � end record; >> >> � � procedure Get_Token(Object : in out Lexer; Token : out Token_Unit > ) is >> >> � � � � procedure Emit_Token(T : Token_Type) is >> � � � � � � T : Token_Type := Token_Type'Val(Character'Pos( > Ch)); >> � � � � begin >> � � � � � � Token := ( Token => T ); >> � � � � end; >> >> � � � � ... � � � � >> >> � � end; >> >> In the above, I need to create a Token_Unit from � � � � � � >> a single character (there is no "id" in this case). > > And how is the compiler supposed to know that there is no "id"? > > When you use a record aggregate, you need to specify values for every > component of the record. If the record has a variant part, then the > compiler won't know what components have to be specified unless it > knows what the discriminant is going to be; Of course. But it is not conceptually inconceivable to check this at runtime and realize that the value I handed out will work with what was provided. If not, then raise an exception. The point here is that there is a wide number of discriminant values that map to the same layout. Now I don't expect anyone to change the rules in Ada to accomodate my request. I am simply laying out a "problem" and looking for a suitable "solution". >> But the issue is this: � � >> >> *.adb:339:33: value for discriminant "token" must be static >> *.adb:339:33: "T" is not static constant or named number (RM 4.9(5)) > > You can't get what you want with an aggregate, but Georg's solution > will give you some of what you want, at least. However, this will > leave all the components (besides the discriminants) uninitialized, > and you'll need to assign values into them. I don't currently see "Georg's solution" post, but perhaps it will arrive soon. > By the way, now that Ada 2005 has the <> construct for aggregates, > it's just occurred to me that maybe 4.3.1(17) can be relaxed a bit, to > make it legal to specify a record aggregate with a nonstatic > discriminant for a variant record, *if* the only component > associations for aggregates are components that are not in variant > parts *and* there is an others=><> in the aggregate (or something > along those lines). I don't know whether it's worthwhile, though. As I originally prototyped it, I just shoe-horned it into one value with nasty C-like conversions. But I am looking for a cleaner "ada way" to do this. > ... I'll consider making a proposal > for this, depending on how loud a groan Randy, Bob, etc., make when > they read this idea... :) > > -- Adam I wasn't looking for compiler-implementation/language amendments. Just looking for good advice on how others would takle this problem. Perhaps the full case statement is the right way, but I gotta say that it puts a damper on readability. Warren