Against if (!expression) throw new Exception(msg);
Don
nospam at nospam.com
Thu Mar 17 09:06:15 PDT 2011
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
More information about the Digitalmars-d
mailing list