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.
dmd's -H family of options allows you to generate .di files which
strip definitions, leaving only declarations in place.
I agree that sometimes finding your way around a huge class or
module is difficult. However, D is not the only language that
does this (C#, Java, Python...), and it's still manageable using
DDoc and .di files.
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,
It doesn't run any interpreters, it mixes in a string as D code
and compiles it.
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`));
};
There's a string import expression
(http://dlang.org/expression.html#ImportExpression) that allows
to import some text file at compile time and make a string
literal out of it. vibe.d, for example, uses it to generate code
for its 'Diet' HTML templates.
Generally, if you can create compile-time parser for something,
you can implement what you're describing above.