From: Warren <ve3wwg@gmail.com>
Subject: Re: Dynamic Variant Record Creation
Date: Tue, 16 Mar 2010 20:01:20 +0000 (UTC)
Date: 2010-03-16T20:01:20+00:00 [thread overview]
Message-ID: <Xns9D3DA2FC9B9BWarrensBlatherings@188.40.43.213> (raw)
In-Reply-To: c3fa9a0f-99c7-4fff-9310-7e4d769065db@s25g2000prd.googlegroups.com
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 3429 bytes --]
Adam Beneschan expounded in
news:c3fa9a0f-99c7-4fff-9310-7e4d769065db@s25g2000prd.googlegroups.com:
> On Mar 16, 10:11�am, Warren <ve3...@gmail.com> 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
next prev parent reply other threads:[~2010-03-16 20:01 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-03-16 17:11 Dynamic Variant Record Creation Warren
2010-03-16 18:31 ` Georg Bauhaus
2010-03-16 18:57 ` Adam Beneschan
2010-03-16 20:01 ` Warren [this message]
2010-03-16 20:09 ` Jeffrey R. Carter
2010-03-16 20:24 ` Warren
2010-03-16 20:40 ` Robert A Duff
2010-03-16 20:44 ` Warren
2010-03-16 20:31 ` Robert A Duff
2010-03-16 20:59 ` Warren
2010-03-16 21:55 ` Jeffrey R. Carter
2010-03-17 14:40 ` Warren
2010-03-18 12:57 ` Warren
2010-03-16 21:58 ` Robert A Duff
2010-03-17 14:22 ` Charmed Snark
2010-03-17 14:49 ` Robert A Duff
2010-03-17 16:30 ` Warren
2010-03-16 21:15 ` Adam Beneschan
2010-03-16 23:24 ` Adam Beneschan
2010-03-16 20:15 ` Robert A Duff
2010-03-16 21:00 ` Warren
2010-03-16 23:39 ` Randy Brukardt
2010-03-16 23:43 ` Randy Brukardt
2010-03-17 0:15 ` Robert A Duff
2010-03-17 14:28 ` Warren
2010-03-18 0:02 ` Randy Brukardt
2010-03-17 4:20 ` Adam Beneschan
2010-03-18 0:13 ` Randy Brukardt
2010-03-18 13:00 ` Warren
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox