On Wed, 16 Mar 2011 22:10:01 -0400, Andrei Alexandrescu <seewebsiteforem...@erdani.org> wrote:

On 03/16/2011 08:53 PM, bearophile wrote:
Andrei:

Yum, love the enforce.

You are silly :-)


So perhaps the language could be improved as enforce does not break purity.

Currently enforce() uses a lazy argument. A lazy argument is a delegate, and generally such delegate can't be pure, because the expressions you give to enforce() usually refer to variables in the scope where you call enforce(). So what kind of language improvements are you thinking about?

I haven't thought through it. Clearly this is a false positive, a restriction that should be at best removed.

int x;

void foo(int i)
{
enforce(i == 5, to!string(x = 5)); // if enforce is pure, this will mean the global x could be affected inside the function
}

I don't think enforce can be straight pure. It can only be pure when called from pure functions. A so-called conditional purity.

If we have auto purity, then I think the compiler could sort this out.

-Steve

Reply via email to