digitalmars.D.learn - function pointer as the enum base type
- mumba (28/28) Oct 05 2008 Idea: to make an enum type with function pointers as it's elements.
- mumba (3/3) Oct 05 2008 mumba Wrote:
- Denis Koroskin (3/38) Oct 05 2008 Looks like it can't sort the enum values at compile time. That's because...
- Jarrett Billingsley (5/55) Oct 05 2008 Nothing of the sort. Enums must derive from an integer or boolean
- Denis Koroskin (14/80) Oct 05 2008 Yeah, of course. But why the following works?
- Robert Fraser (2/90) Oct 05 2008 I would call that a "bug".
- Steven Schveighoffer (4/68) Oct 06 2008 AFAIK, enums can derive from any type in D2, including non-integer types...
- mumba (2/4) Oct 05 2008 That's another thing I'm meditating on. Why do we need any kind of order...
- BCS (2/3) Oct 05 2008 If some way was included to enforce the values being in the set.. Vote++...
Idea: to make an enum type with function pointers as it's elements. Problem: no more than one element can be inserted! $echo ' void foo() {} void bar() {} enum Enum : void function() { FOO = &foo, BAR = &bar } int main() { return 0; }' > enum.d $dmd --help Digital Mars D Compiler v2.014 Copyright (c) 1999-2008 by Digital Mars written by Walter Bright Documentation: http://www.digitalmars.com/d/2.0/index.html ... $dmd enum.d enum.d(5): Error: Integer constant expression expected instead of (& bar) < (& foo) enum.d(5): Error: Integer constant expression expected instead of (& bar) > (& foo) I don't understand the error message. First - why integer constant expression expected, if it's supposed to be the function based enum? Second - instead of what? (& bar) expression, which is smaller than (& foo), or boolean expression (& bar) < (& foo)? Third - in both cases: if only one of these messages appeard - it would be just strange for me. But as they are together and both refer to the same line - I'm knocked out. What logic leads to such mutually exclusive pieces of information? Please someone explain it to me. By the way: enum Enum : void function() { FOO = &foo } works fine. cheers
Oct 05 2008
mumba Wrote: uh, sorry :( . The error message refers to the 7th line. To this, to be precise: BAR = &bar
Oct 05 2008
On Mon, 06 Oct 2008 03:21:09 +0400, mumba <qniol o2.pl> wrote:Idea: to make an enum type with function pointers as it's elements. Problem: no more than one element can be inserted! $echo ' void foo() {} void bar() {} enum Enum : void function() { FOO = &foo, BAR = &bar } int main() { return 0; }' > enum.d $dmd --help Digital Mars D Compiler v2.014 Copyright (c) 1999-2008 by Digital Mars written by Walter Bright Documentation: http://www.digitalmars.com/d/2.0/index.html ... $dmd enum.d enum.d(5): Error: Integer constant expression expected instead of (& bar) < (& foo) enum.d(5): Error: Integer constant expression expected instead of (& bar) > (& foo) I don't understand the error message. First - why integer constant expression expected, if it's supposed to be the function based enum? Second - instead of what? (& bar) expression, which is smaller than (& foo), or boolean expression (& bar) < (& foo)? Third - in both cases: if only one of these messages appeard - it would be just strange for me. But as they are together and both refer to the same line - I'm knocked out. What logic leads to such mutually exclusive pieces of information? Please someone explain it to me. By the way: enum Enum : void function() { FOO = &foo } works fine. cheersLooks like it can't sort the enum values at compile time. That's because &foo and &bar are not known until codegen phase.
Oct 05 2008
On Sun, Oct 5, 2008 at 7:26 PM, Denis Koroskin <2korden gmail.com> wrote:On Mon, 06 Oct 2008 03:21:09 +0400, mumba <qniol o2.pl> wrote:Nothing of the sort. Enums must derive from an integer or boolean type, which function pointers certainly are not. It's perfectly fine to say: const FOO = &foo;Idea: to make an enum type with function pointers as it's elements. Problem: no more than one element can be inserted! $echo ' void foo() {} void bar() {} enum Enum : void function() { FOO = &foo, BAR = &bar } int main() { return 0; }' > enum.d $dmd --help Digital Mars D Compiler v2.014 Copyright (c) 1999-2008 by Digital Mars written by Walter Bright Documentation: http://www.digitalmars.com/d/2.0/index.html ... $dmd enum.d enum.d(5): Error: Integer constant expression expected instead of (& bar) < (& foo) enum.d(5): Error: Integer constant expression expected instead of (& bar)Looks like it can't sort the enum values at compile time. That's because &foo and &bar are not known until codegen phase.(& foo)I don't understand the error message. First - why integer constant expression expected, if it's supposed to be the function based enum? Second - instead of what? (& bar) expression, which is smaller than (& foo), or boolean expression (& bar) < (& foo)? Third - in both cases: if only one of these messages appeard - it would be just strange for me. But as they are together and both refer to the same line - I'm knocked out. What logic leads to such mutually exclusive pieces of information? Please someone explain it to me. By the way: enum Enum : void function() { FOO = &foo } works fine. cheers
Oct 05 2008
On Mon, 06 Oct 2008 03:33:05 +0400, Jarrett Billingsley <jarrett.billingsley gmail.com> wrote:On Sun, Oct 5, 2008 at 7:26 PM, Denis Koroskin <2korden gmail.com> wrote:Yeah, of course. But why the following works? import std.stdio; int foo() { return 42; } enum Enum : int function() { FOO = &foo, // BAR = &foo // uncomment the line and it stops working } int main() { writefln(Enum.FOO()); return 0; }On Mon, 06 Oct 2008 03:21:09 +0400, mumba <qniol o2.pl> wrote:Nothing of the sort. Enums must derive from an integer or boolean type, which function pointers certainly are not. It's perfectly fine to say: const FOO = &foo;Idea: to make an enum type with function pointers as it's elements. Problem: no more than one element can be inserted! $echo ' void foo() {} void bar() {} enum Enum : void function() { FOO = &foo, BAR = &bar } int main() { return 0; }' > enum.d $dmd --help Digital Mars D Compiler v2.014 Copyright (c) 1999-2008 by Digital Mars written by Walter Bright Documentation: http://www.digitalmars.com/d/2.0/index.html ... $dmd enum.d enum.d(5): Error: Integer constant expression expected instead of (& bar) < (& foo) enum.d(5): Error: Integer constant expression expected instead of (& bar)Looks like it can't sort the enum values at compile time. That's because &foo and &bar are not known until codegen phase.(& foo)I don't understand the error message. First - why integer constant expression expected, if it's supposed to be the function based enum? Second - instead of what? (& bar) expression, which is smaller than (& foo), or boolean expression (& bar) < (& foo)? Third - in both cases: if only one of these messages appeard - it would be just strange for me. But as they are together and both refer to the same line - I'm knocked out. What logic leads to such mutually exclusive pieces of information? Please someone explain it to me. By the way: enum Enum : void function() { FOO = &foo } works fine. cheers
Oct 05 2008
Denis Koroskin wrote:On Mon, 06 Oct 2008 03:33:05 +0400, Jarrett Billingsley <jarrett.billingsley gmail.com> wrote:I would call that a "bug".On Sun, Oct 5, 2008 at 7:26 PM, Denis Koroskin <2korden gmail.com> wrote:Yeah, of course. But why the following works? import std.stdio; int foo() { return 42; } enum Enum : int function() { FOO = &foo, // BAR = &foo // uncomment the line and it stops working } int main() { writefln(Enum.FOO()); return 0; }On Mon, 06 Oct 2008 03:21:09 +0400, mumba <qniol o2.pl> wrote:Nothing of the sort. Enums must derive from an integer or boolean type, which function pointers certainly are not. It's perfectly fine to say: const FOO = &foo;Idea: to make an enum type with function pointers as it's elements. Problem: no more than one element can be inserted! $echo ' void foo() {} void bar() {} enum Enum : void function() { FOO = &foo, BAR = &bar } int main() { return 0; }' > enum.d $dmd --help Digital Mars D Compiler v2.014 Copyright (c) 1999-2008 by Digital Mars written by Walter Bright Documentation: http://www.digitalmars.com/d/2.0/index.html ... $dmd enum.d enum.d(5): Error: Integer constant expression expected instead of (& bar) < (& foo) enum.d(5): Error: Integer constant expression expected instead of (& bar)Looks like it can't sort the enum values at compile time. That's because &foo and &bar are not known until codegen phase.(& foo)I don't understand the error message. First - why integer constant expression expected, if it's supposed to be the function based enum? Second - instead of what? (& bar) expression, which is smaller than (& foo), or boolean expression (& bar) < (& foo)? Third - in both cases: if only one of these messages appeard - it would be just strange for me. But as they are together and both refer to the same line - I'm knocked out. What logic leads to such mutually exclusive pieces of information? Please someone explain it to me. By the way: enum Enum : void function() { FOO = &foo } works fine. cheers
Oct 05 2008
"Jarrett Billingsley" wroteOn Sun, Oct 5, 2008 at 7:26 PM, Denis Koroskin <2korden gmail.com> wrote:AFAIK, enums can derive from any type in D2, including non-integer types. I think the request is reasonable for D2, where enum wears many hats. -SteveOn Mon, 06 Oct 2008 03:21:09 +0400, mumba <qniol o2.pl> wrote:Nothing of the sort. Enums must derive from an integer or boolean type, which function pointers certainly are not. It's perfectly fine to say: const FOO = &foo;Idea: to make an enum type with function pointers as it's elements. Problem: no more than one element can be inserted! $echo ' void foo() {} void bar() {} enum Enum : void function() { FOO = &foo, BAR = &bar } int main() { return 0; }' > enum.d $dmd --help Digital Mars D Compiler v2.014 Copyright (c) 1999-2008 by Digital Mars written by Walter Bright Documentation: http://www.digitalmars.com/d/2.0/index.html ... $dmd enum.d enum.d(5): Error: Integer constant expression expected instead of (& bar) < (& foo) enum.d(5): Error: Integer constant expression expected instead of (& bar)Looks like it can't sort the enum values at compile time. That's because &foo and &bar are not known until codegen phase.(& foo)I don't understand the error message. First - why integer constant expression expected, if it's supposed to be the function based enum? Second - instead of what? (& bar) expression, which is smaller than (& foo), or boolean expression (& bar) < (& foo)? Third - in both cases: if only one of these messages appeard - it would be just strange for me. But as they are together and both refer to the same line - I'm knocked out. What logic leads to such mutually exclusive pieces of information? Please someone explain it to me. By the way: enum Enum : void function() { FOO = &foo } works fine. cheers
Oct 06 2008
Denis Koroskin Wrote:Looks like it can't sort the enum values at compile time. That's because &foo and &bar are not known until codegen phase.That's another thing I'm meditating on. Why do we need any kind of ordering in enum types? Isn't it supposed to be the SET of possible values? Set containing not necessarily orderable elements?
Oct 05 2008
Reply to mumba,Idea: to make an enum type with function pointers as it's elements.If some way was included to enforce the values being in the set.. Vote++;
Oct 05 2008