Why callers should explicitly document storage classes

Brad Roberts braddr at puremagic.com
Sun Aug 14 17:39:29 PDT 2011


On Sunday, August 14, 2011 2:30:39 PM, Jonathan M Davis wrote:
> On Sunday, August 14, 2011 23:20:12 Timon Gehr wrote:
>> On 08/14/2011 10:36 PM, Jonathan M Davis wrote:
>>> On Sunday, August 14, 2011 22:25:36 Timon Gehr wrote:
>>>> On 08/14/2011 10:00 PM, Vladimir Panteleev wrote:
>>>>> On Sun, 14 Aug 2011 22:48:18 +0300, Timon Gehr<timon.gehr at gmx.ch>  
> wrote:
>>>>>> requiring lazy before lazy arguments basically destroys the reason
>>>>>> for
>>>>>> lazy being in the language:
>>>>>>
>>>>>> int foo(lazy 2*3);
>>>>>>
>>>>>> is not better than
>>>>>>
>>>>>> int foo({return 2*3});
>>>>>
>>>>> What about requiring "lazy" only for non-pure delegates?
>>>>
>>>> Actually I would rather require lazy arguments to be pure, so that
>>>> they
>>>> can be guaranteed to be executed at most once.
>>>
>>> That still wouldn't be guaranteed, since pure function calls are only
>>> optimized out if they're strongly pure and in the same expression. You
>>> can't rely on calls to pure function
s being optimized.
>>>
>>> - Jonathan M Davis
>>
>> My point was, that if lazy arguments were required to be pure, such a
>> thing _could_ then be guaranteed independently from optimizations that
>> may or may not take place on general pure functions.
> 
> Yes. In theory. It would depend on what Walter was willing to do with the 
> language and the compiler though. At present, pure is purely an optimization 
> and not use to affect semantics at all.

The pure keyword doesn't _change_ semantics, but it very much affects 
semantics, through restriction and the guarantees it provides.  The 
restrictions help enforce some very specific and broadly useful 
behaviors.  But you know this.
 
> However, I'd actually argue that lazy delegates should be effectively treated 
> as pure anyway. Conceptually, what you're doing is delaying the execution of 
> the expression in case it isn't needed. I don't see any reason why the end 
> result should be any different from passing a non-lazy a
rgument. As such, the 
> lazy argument should only be called once regardless. It wouldn't surprise me 
> at all if the implementation doesn't work that way, but I'd argue that it 
> should regardless of purity. From the standpoint of the function, the lazy 
> argument is just like any other argument in terms of its value, and IMHO it 
> should be treated that way.

That's not the way it behaves, or is defined to behave.  Lazy 
parameters are executed 0-N times, entirely based on the implementation 
of the method itself.  It _could_ be re-done to mean 0 or 1, but that's 
still not always 1.  If it was, might as well kill the lazy concept.
 
> - Jonathan M Davis




More information about the Digitalmars-d mailing list