digitalmars.D.learn - UFCS with implicit "this" ?
- cy (35/35) Aug 08 2016 I really like UFCS, which is to say, defining functions outside
- Jonathan M Davis via Digitalmars-d-learn (12/34) Aug 08 2016 Personally, I think that you should just make it a member function if it...
- cy (13/17) Aug 09 2016 Well, I use generics for when I have like, optional functionality
I really like UFCS, which is to say, defining functions outside the class/struct to operate on it, but you can still say object.function(...) and it'll get rewritten into function(object,...). Only sticky point is the convenience of "this". Like I can go struct A { bool a; bool b; bool c; bool d; bool foo() { return a && b || c && !d; } } But if I try do do the same thing with "bool bar(A object)" I end up with this: bool bar(A object) { return object.a && object.b || object.c && !object.d; } My example is a bit contrived, but it occurred to me how neat it would be if we could just specify "implicit" objects in our current scope. Like I was messing with an RGB and an HSL object, and I ended up having things like: hsl.saturation = (max(rgb.r,rgb.g,rgb.b) - min(rgb.r,rgb.g,rgb.b)) / (2 - max(rgb.r,rgb.g,rgb.b) - min(rgb.r,rgb.g.rgb.b)) when I wanted something more like this: saturation = (max(r,g,b) - min(r,g,b)) / (2 - max(r,g,b) - min(r,g,b) Is there any way to do that in D? They don't let you use "alias this rgb" for a function scope, only a type's scope, so I guess it isn't possible? I mean, aside from making an inner structure to the function, and copying the object by value... that's even more confusing than worth the convenience.
Aug 08 2016
On Tuesday, August 09, 2016 05:13:44 cy via Digitalmars-d-learn wrote:I really like UFCS, which is to say, defining functions outside the class/struct to operate on it, but you can still say object.function(...) and it'll get rewritten into function(object,...). Only sticky point is the convenience of "this". Like I can go struct A { bool a; bool b; bool c; bool d; bool foo() { return a && b || c && !d; } } But if I try do do the same thing with "bool bar(A object)" I end up with this: bool bar(A object) { return object.a && object.b || object.c && !object.d; } My example is a bit contrived, but it occurred to me how neat it would be if we could just specify "implicit" objects in our current scope.Personally, I think that you should just make it a member function if it's not a generic function, but to each their own, I suppose. Regardless, there's already a feature to do what you're looking for - with statements. e.g. bool bar(A object) { with(object) return a && b || c && !d; } https://dlang.org/spec/statement.html#WithStatement - Jonathan M Davis
Aug 08 2016
On Tuesday, 9 August 2016 at 05:33:09 UTC, Jonathan M Davis wrote:Personally, I think that you should just make it a member function if it's not a generic function, but to each their own,Well, I use generics for when I have like, optional functionality that isn't inherent to the class itself. Since I avoid using wildcard imports, I won't import any generics I don't specify by name, when I import the class itself. It's good for extending or adding informal things on the side, bells and whistles basically. Sometimes it can be useful for third party structures. Or combinations of existing member functions, in ways that only have limited applicability (like a calculation for graphics, that the database backend won't care about).with(object) return a && b || c && !d;And... the feature already exists, I just didn't know about it. Thanks!
Aug 09 2016