On Monday, 10 February 2014 at 15:35:00 UTC, Patrick D. Jeeves wrote:
One thing I've been trying to figure out is how to do the following in D:

class foo
{
    string bar();
};

void foo::bar()
{
    return "hello world!";
}

From what I can gather constructs like this just aren't allowed in D, but I don't understand why, can anyone explain it please? I know they're only in C++ because it uses #include instead of importing compiled modules, but I find it hard to quickly get a general idea of what a class is supposed to do when there are function definitions strewn about it.

There have been lengthy discussions about this before, perhaps try searching the forums for them (I can't quite remember the title of the most recent one...).

Personally I recommend generating documentation (using DDoc et al) for your types and referencing at that.

The other thing I want to know is about the mixin() command, and what the limitations of it are; I know it runs an interpreted version of D, but I get the feeling that it isn't as powerful as the compiled version, because no one seems to have tried making something like this:

class example : File
{
     mixin(d.flex(`lex_file.l`));
     mixin(d.bison(`bison_file.y`));
};

void main()
{
     example("some_file.txt");
     example.yyparse();
};

Is this because it isn't possible to do such things, or because it would be rather pointless to do so compared to simpler approaches, (in this case calling the C function output by flex/bison).

There are D projects that do this kind of thing, e.g. Pegged[1] and a proposed std.lexer[2].

Mixin expressions can mixin any string available/computable at compile-time and there are no limits to what the mixed-in code can do. However, if the mixed-in code is subsequently executed *at compile-time*, it is limited by the same restrictions all compile-time executation have[3].

[1] https://github.com/PhilippeSigaud/Pegged
[2] https://github.com/Hackerpilot/Dscanner/blob/master/stdx/lexer.d
[3] http://dlang.org/function#interpretation

Reply via email to