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