On Saturday, 8 June 2013 at 14:57:17 UTC, monarch_dodra wrote:
My beef though is that the syntax is a bit opaque, and not
really idiomatic. It looks more like a hacker's trick than a
real language feature. It's not something you'd do "naturally".
At least, I know a beginner may not feal comfortable with this.
Given that users are now actually doing this, that we have
proof it works and is a useful feature, shouldn't we push to
have actual blocks with attributes in the language?
I think we should... Thoughts?
Here's my go at cleaning up the syntax a bit:
----
auto block(string attr)() {
static struct Blk {
mixin(q{
void opBinary(string op:"in", T)(T dg) } ~ attr ~ q{
if (is(typeof(() } ~ attr ~ q{ { dg(); }))) {
dg();
}
void opBinary(string op:"in", T)(T dg) if
(!is(typeof(() } ~ attr ~ ` { dg(); }))) {
static assert(false, "Provided delegate is not "
~ "` ~ attr ~ `");
}
`);
}
return Blk();
}
void main() {
// Works
block!"nothrow" in {
// Doesn't throw
};
// Fails
block!"nothrow" in {
throw new Exception("");
};
}
----
Downsides are the required semicolon (needed for your method too)
and abuse of operator overloading.