Proposal: Extension Methods
Dee Girl
deegirl at noreply.com
Sun May 18 07:54:34 PDT 2008
Nick Sabalausky Wrote:
> "Nick Sabalausky" <a at a.a> wrote in message
> news:g08fha$2e5$1 at digitalmars.com...
> >I thought I had seen discussion on something like this back when the
> >"Functions as Array Properties" feature was introduced, but I just did a
> >search and didn't see much of anything. So sorry if this has been discussed
> >to death before.
> >
> > I propose adding to D a feature that C# calls extension methods. These are
> > similar to D's "Functions as Array Properties", but provide more control
> > and flexibility.
> >
> > For any function that's not a member of a class (and maybe also static
> > member functions of classes), if you add the modifier "extend" or "this"
> > to first argument of the function declaration like this:
> >
> > // Normal Function
> > void Foo(MyClass arg) {/*...*/}
> >
> > // Extension Method (I'm proposing either of these, but not both):
> > void Foo(this MyClass arg) {/*...*/} // C#-style
> > void Foo(extend MyClass arg) {/*...*/} // Might be more readable
> >
> > (Although, there wouldn't actually be overloading based soley on whether
> > or not it's declared as an extension method. (Or would there? Probably
> > not.))
> >
> > Then that allows you to call Foo like this:
> >
> > auto obj = new MyClass();
> >
> > // Always allowed
> > Foo(obj);
> >
> > // Allowed if and only if Foo has been declared
> > // using the above extension method syntax.
> > // But regardless, Foo never has access to private members
> > // of MyClass, since it still isn't a true member.
> > obj.Foo();
> >
> > This should also be allowed for primitives:
> >
> > void Foo(extend int arg);
> > int myInt = 7;
> > myInt.Foo();
> > 5.Foo(); // Might interfere with parsing of floating-point literals,
> > though.
> >
> > This has two advantages over the current "Functions as Array Properties"
> > feature:
> >
> > 1. It supports more than just arrays (obviously).
> > 2. The special syntax is only available if the function's author intends
> > it as a non-member "extension" to the given type.
> >
> > Possible modifications to this proposal:
> >
> > - If advantage #2 is deemed to be an unwarranted concern, I'd be happy to
> > at least have the current "Functions as Array Properties" feature extended
> > to all types, not just arrays.
> >
> > - Maybe declaring a function as an extension method would *require* it to
> > be called using extension method syntax. Although under this arrangement,
> > if you wanted a function to be callable via either syntax (but would this
> > ability really be desirable?), that would require a function overload or a
> > messy kludge like using "maybe_extend" instead of "extend".
> >
>
> I was just looking through the documentation on some of the Phobos stuff
> that's new in D2, and at pipe! and compose! in particular. This is kind of
> nice (from docs):
>
> int[] a = pipe!(readText, split, map!(to!(int)))("file.txt");
>
> Not to nag about extension methods (well, ok, yes: to nag ;) ), but with
> extension methods (regardless if they're explicit or implicit), that could
> be cleaned up to:
>
> int[] a = "file.txt".readText().split().map!(to!(int)))();
>
> Granted, this doesn't actually create a new composite function. But for
> cases like this one where a reusable composite function isn't needed, it
> increases readablity quite a bit.
>
> It would also allow extra paramaters to be specified without having to turn
> them into template parameters:
>
> int[] a = "file.csv".readText().split(",").map!(to!(int)))();
This is big problem with functional style in D! D does not have currying. Unfortunate you can not write split(",") and obtain a new function. Maybe language in future can accept split(_, ",") meaning function that takes one argument and passes to split in first position and "," in second position. Dee Girl
More information about the Digitalmars-d
mailing list