Why callers should explicitly document storage classes

Jonathan M Davis jmdavisProg at gmx.com
Sun Aug 14 17:49:14 PDT 2011


On Sunday, August 14, 2011 17:39:29 Brad Roberts wrote:
> 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.

Oh, I know that it's not always 1, and I'm not suggesting that it always be 1. 
I'm suggesting that it always be 0 or 1, and that it not actually be called 
multiple times even if it's referenced multiple times. I don't see why there 
is any value in having it called multiple times. In concept at least, a non-
lazy parameter is the same as a non-lazy except that it isn't evaluated unless 
it's used. And so I don't see why you'd want to be evaluating it multiple 
times except that it's probably easier to implement that way.

- Jonathan M Davis


More information about the Digitalmars-d mailing list