Proposed D2 Feature: => for anonymous delegates

Don nospam at nospam.com
Wed Oct 21 06:28:49 PDT 2009


Andrei Alexandrescu wrote:
> language_fan wrote:
>> Wed, 21 Oct 2009 12:35:41 +0200, Pelle Månsson thusly wrote:
>>
>>> Andrei Alexandrescu wrote:
>>>> Pelle Månsson wrote:
>>>>> Jason House wrote:
>>>>>> Andrei Alexandrescu Wrote:
>>>>>>
>>>>>>> Jason House wrote:
>>>>>>>> Am I the only one that has trouble remembering how to write an
>>>>>>>> inline anonymous delegate when calling a function? At a minimum,
>>>>>>>> both Scala and C# use (args) => { body; } syntax. Can we please
>>>>>>>> sneak it into D2?
>>>>>>> We have (args) { body; }
>>>>>>>
>>>>>>> Andrei
>>>>>> Somehow, I missed that. What kind of type inference, if any, is
>>>>>> allowed? Scala and C# allow omiting the type. Lately I'm doing a lot
>>>>>> of (x) => { return x.foo(7); } in C# and it's nice to omit the
>>>>>> amazingly long type for x. The IDE even knows the type of x for
>>>>>> intellisense... I think scala would allow x => foo(7), or maybe even
>>>>>> => _.foo(7) or even _.foo(7). I haven't written much scala, so I may
>>>>>> be way off...
>>>>> Recent experiments by myself indicate you cannot omit the type and you
>>>>> cannot use auto for the type, so you actually need to type your
>>>>> VeryLongClassName!(With, Templates) if you need it.
>>>>>
>>>>> I sort of miss automatic type deduction.
>>>> Actually, full type deduction should be in vigor, but it is known that
>>>> the feature has more than a few bugs. Feel free to report any instance
>>>> in which type deduction does not work in bugzilla.
>>>>
>>>> Andrei
>>> int f(int delegate(int) g) {
>>>      return g(13);
>>> }
>>> void main() {
>>>      f((auto x) { return x+13; });
>>> }
>>>
>>> This does not compile in D v2.034. Am I missing something?
>>
>> No, in this context the exact type can be inferred unambiguously 
>> without worrying about overloading.
> 
> The program should be roughly equivalent with:
> 
> int f(int delegate(int) g) {
>     return g(13);
> }
> 
> auto __fun(T)(T x) { return x+13; }
> 
> void main() {
>     f(&__fun);
> }
> 
> which fails with
> 
> Internal error: e2ir.c 644
> 
> :o)

Can't reproduce that. It doesn't ICE for me. Tried on several DMD 
versions. (Doesn't compile, though).


> In brief, an untyped function literal should be considered an unbound 
> template, and as long as type deduction can figure out the types (no 
> Hindley-Milner, sorry) things should hold water.
> 
> 
> Andrei



More information about the Digitalmars-d mailing list