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