Pure functions in D

Denis Koroskin 2korden at gmail.com
Mon Sep 22 15:28:18 PDT 2008


On Tue, 23 Sep 2008 02:12:58 +0400, Steven Schveighoffer  
<schveiguy at yahoo.com> wrote:

> "bearophile" wrote
>> Walter:
>>> Parameters to a pure function can be mutable, but calls cannot be  
>>> cached
>>> or executed asynchronously if the arguments contain any references to
>>> mutable data.<
>>
>> I don't understand how can such function be pure.
>
> It can't be.  I think Walter made a mistake there.  Otherwise, you could
> pass data that another thread changes while in the middle of using it.
>
> Maybe he meant that a pure function can *return* mutable data?  Then  
> 'new'
> could be considered pure?
>
> Another possibility is that Walter is assuming the shared/unshared  
> paradigm
> is in place.
>
> Another possibility is that pure functions that accept mutable parameters
> can only be called from other pure functions, therefore you are  
> guaranteed
> that the data is not being used in any other thread.
>
> Who knows what he was thinking ;)  But the current article statement is
> definitely wrong without clarification.
>
> -Steve
>
>

I think he meant both:

> Pure functions do not require synchronization for use by multiple  
> threads,
> because their data is all either *thread local* or immutable.

Given that an implicit unshared attribute is attached to mutable variable  
arguments such functions are definitely pure:

pure void inplace_tolower(char[] str); // yes!

pure Foo bar()
{
     char[] str = "HELLO".dup;
     inplace_tolower(str);
     ...
}



More information about the Digitalmars-d mailing list