Lars T. Kyllingstad wrote:
On Thu, 17 Mar 2011 07:51:33 +0100, Don wrote:
Daniel Gibson wrote:
I'd just like to summarize what useful stuff came out of this topic:
* enforce is useful and more than a "always activated assert" ;-) *
enforce prevents inlining and thus has negative impact on performance -
this should probably be fixed.
* enforce can't be used in weakly pure functions - this has the
side-effect that iota() (maybe other functions as well) can't be used
in pure functions - this should also be fixed. if fixing it is
difficult /maybe/ if+throw should be used in potentially (weakly) pure
functions in phobos until it is fixed
That was discussed on the Phobos ng some time back. I don't think it's a
compiler issue. It's just not pure because the lazy delegate isn't
marked as pure. Since you can overload on pure, I'm not sure why this
hasn't been done yet.
You can overload on pure, yes, but only when you pass an explicit
delegate. The following doesn't work, for instance:
void foo(pure lazy string s) { ... }
The compiler complains that "basic type expected, not pure".
Ah, OK. I was pretty sure there wasn't a problem with delegates, didn't
realize that lazy was the issue. Nonetheless, I think we can just
overload enforce() to fix this problem.
With "lazy", the compiler creates a delegate under the hood, and it needs
the ability to deduce when that delegate can be marked as pure. For the
function above, for instance, passing a simple string literal should be
perfectly fine, as should the following:
int baz() pure { ... }
string bar(int i) pure { ... }
foo(bar(baz()));
-Lars