Lazy eval -- an example issue

kris foo at bar.com
Tue Aug 22 22:18:47 PDT 2006


Sean Kelly wrote:
> Walter Bright wrote:
> 
>> Sean Kelly wrote:
>>
>>> I'll admit that doing so makes a difference to me, as it allows for 
>>> tricks that aren't possible with explicit delegate signifiers.  But 
>>> I'm undecided as to whether this is a "good thing" or not--I plan to 
>>> give it some time before I decide.
>>
>>
>> Good - I don't think any of us are prescient enough to see all the 
>> ramifications of this. Nobody predicted where C++ templates wound up 
>> (the good and the bad).
> 
> 
> C++ templates are well-intentioned and really quite powerful, but 
> they're a horrible hack, even when used as originally intended.  The 
> need for "template" as a means to distinguish dependent type names is a 
> perfect example of something that should be completely unnecessary.
> 
>>> And I'd like to note that all the tricks I'm thinking of for the new 
>>> syntax tend to involve refactoring existing code (which is 
>>> potentially dangerous, given the issue with side-effects) rather than 
>>> writing new code.  With new code I don't see much benefit to omitting 
>>> all evidence that a parameter will be converted to a delegate, as 
>>> it's something the user must be aware of to write correct code.
> 
> 
> In light of my opening paragraph, I really shoudn't have said "all."
> 
>> I can't stress this enough - one must *already* be aware of the 
>> declaration to write correct code. Implicit conversions can cause 
>> trouble, as well as in, out, inout, const, and all the other storage 
>> classes discussed.
> 
> 
> True enough.  But I consider this a somewhat different class of 
> unpredictable behavior, if only because it isn't something present in 
> this way in any other C-like language (C# 3.0 will have lambda functions 
> similar to this with a leading => at the call point).
> 
>> Previous discussions here frequently revolved around the need to put 
>> information in the function declaration so people have some guarantees 
>> about what the function does - const is a prime example. Another is 
>> the suggestion to move the contracts from the implementation to the 
>> declaration.
>>
>> There is no way to know what:
>>
>>     somefunc(++i);
>>
>> does without looking at the declaration for somefunc() - even without 
>> lazy evaluation.
> 
> 
> But the possibilities are rather limited, either i will be mutated or it 
> will not.  I suppose what worries me isn't that I need to look at the 
> declaration to determine what will happen with implicit delegate 
> conversion, but that even looking at the declaration won't tell me what 
> may happen.
> 
> By the same token, I actually like C's method of pass-by-reference 
> because call-side code inspection reveals which parameters may be 
> modified.  I think this is why I like the suggestion to retain curly 
> braces and perhaps derive the return value automatically--it makes the 
> contract between caller and callee explicit.
> 
> But this is a new feature and I do want to spend more time with it 
> before making a final decision.  If nothing else, I agree that time and 
> experience will reduce the chance of mistakes demonstrated recently, as 
> this becomes "just another tool" we have available.
> 
> 
> Sean


Tom's suggestion is to introduce a different style of delegate for this 
lambda expression thingy. That would resolve the difficulties here 
(assuming delegates can be auto-converted to the lambda expr; per Tom's 
suggestion).

But for delegate itself, it sure would be nice to have:

# somefunk ({++i});

as a shorthand for

# somefunk ({return ++i;});



More information about the Digitalmars-d mailing list