To help LDC/GDC
John Colvin
john.loughran.colvin at gmail.com
Thu Apr 11 03:29:02 PDT 2013
On Thursday, 11 April 2013 at 10:27:55 UTC, kenji hara wrote:
> 2013/4/11 John Colvin <john.loughran.colvin at gmail.com>
>
>> On Thursday, 11 April 2013 at 10:03:39 UTC, deadalnix wrote:
>>
>>> On Thursday, 11 April 2013 at 08:36:13 UTC, Joseph Rushton
>>> Wakeling wrote:
>>>
>>>> On 04/10/2013 08:39 PM, Walter Bright wrote:
>>>>
>>>>> Sure there is. Declare the function as pure, and the
>>>>> function's
>>>>> parameters as
>>>>> const or immutable.
>>>>>
>>>>
>>>> Sure, I accept that. What I was meaning, though, was an
>>>> up-front
>>>> declaration
>>>> which would make the compiler shout if those necessary
>>>> conditions were
>>>> not met.
>>>>
>>>> i.e.
>>>>
>>>> pure foo(int n) { ... } // compiles
>>>>
>>>> strong pure bar(int n) { ... } // compiler instructs
>>>> you to make
>>>> // variables const or
>>>> immutable
>>>>
>>>
>>> Both are strongly pure.
>>>
>>
>> is foo strongly pure because of n being a value type that
>> cannot contain
>> any indirection? (i.e. as far as the outside world is
>> concerned you don't
>> get any side effects whatever you do with it).
>>
>> Is the same for structs that contain no indirection? Or do
>> they have to be
>> const/immutable?
>>
>
> It is same for structs that has no *mutable* indirections. In
> below, all
> functions are strongly pure.
>
> module x;
> struct S1 { int n; }
> struct S2 { immutable int[] arr; }
> struct S3 { int[] arr; }
>
> pure int foo0(int n);
> pure int foo1(S1); // S1 has no indirections
> pure int foo2(S2); // S2 has no *mutable* indirections
> pure int foo3(immutable ref S3 x); // foo3 cannot access any
> mutable
> indirections
>
> Kenji Hara
right, gotcha!
More information about the Digitalmars-d
mailing list