Against enforce()

Simen kjaeraas simen.kjaras at gmail.com
Mon Mar 21 14:29:11 PDT 2011


On Mon, 21 Mar 2011 15:35:58 +0100, Steven Schveighoffer  
<schveiguy at yahoo.com> wrote:

> Why does one make sense and the other not?  In other words, if I have a  
> function like this:
>
> int foo(int delegate() x) pure {...}
>
> is this *ever* callable from a strong-pure function?  Or does the  
> delegate have to be declared pure?  It seems to me that either:
>
> 1) it's not ever callable from a strong-pure function, making the pure  
> decoration useless or
> 2) it's callable from a strong pure function, but then the compiler  
> needs to generate two copies of the function, one with a pure delegate,  
> one without.
>
> On item 2, the reason I feel this way is in the case where foo wants to  
> pass the delegate to another pure function, it might optimize that call  
> differently if the delegate is known to be pure.  Or maybe we  
> don't/can't care...

That is a good point. However, pure delegates should (but might not
currently) be implicitly castable to impure. Hence, one version, taking
an impure delegate, should be enough.

Moreover, I believe a pure delegate could only ever be weakly-pure, hence
precluding the use of aggressive optimizations.

If my first assumption is correct, and the latter is not, the problem
should only occur if you have two versions of a function, one taking a
pure delegate, the other taking an impure one.


-- 
Simen


More information about the Digitalmars-d mailing list