Irakli Gozalishvili wrote:
I think more general problem with arrow functions is that they can not capture object on which method call happened:

As I tweeted, this is true of any function that ignores |this| or binds it. Nothing new with arrows except the convenience.

We've been around that block and will go again. If we want convenient unbound-this function syntax, -> stands ready. I proposed it along with => originally but it was cut by TC39 during our March meeting in order to achieve consensus on =>.


object.foo(bar)

If `object.foo` is an arrow function it has no way of knowing weather it was invoked as a function or a method. Neither it get's reference to an `object`. This makes composition between functional & OO styles components hard.

No, I don't think so. The ability of a function to ignore any parameter, including |this|, may frustrate composition, but the contract of an API includes mandatory parameterization of any funargs.

People deal with this pretty well in practice, usually by writing small-world codebases and wrapping anything unknown that needs contract-enforcement along these lines.

Passing owner `object` of the arrow method as first argument solves this problem, by making

object.foo(bar)

just a sugar for

var foo = object.foo;
foo(object, bar);

This completely breaks functional abstraction, of course.

f(a)

and

o.m(a)

in JS should never pass more than one actual parameter to the callee, however it was declared or expressed.

/be



Regards
--
Irakli Gozalishvili
Web: http://www.jeditoolkit.com/

On Wednesday, 2012-07-11 at 10:23 , Irakli Gozalishvili wrote:

It is true that on could wrap arrow function into vintage one in order to reuse it as a method, but that is a poor mans workaround. As of motivation, all I really want is to have a synergy of different paradigms that are in the language.

What I really mean by that is, if one writes in a functional style:

var map = (list, f) =>
  reduce(list, (result, value) =>
     result.concat([ f(value) ]), [])

That should be reusable in OO code without any changes or wrappers:

List.prototype.map = map
List().map((x) => x + 1)

Also this complements another idea that I have posted a while ago:
https://mail.mozilla.org/pipermail/es-discuss/2012-June/023657.html

Where I proposed to make private names functions:

var method = Name()
method(object, arg) // is just a sugar for
object[method](arg)

This will enable people to write code in OO or functional style and make it usable in other style:

var map = Name();
List.prototype[map] = (list, f) =>
  reduce(list, (result, value) => result.concat([ f(value) ]), [])

Which one will be able to us in a functional style

map(list, f)

or in OO

list[map](f)

Also even if suggested changes to private names won't take of, it's still can be implemented as a library:
https://github.com/Gozala/method

There for a way to author functions that also can be used as methods is relevant. Thin arrows would probably also solve this problem.

Regards
--
Irakli Gozalishvili
Web: http://www.jeditoolkit.com/

On Wednesday, 2012-07-11 at 09:39 , Claus Reinke wrote:

function map(f) {
return this.reduce((result, value) => result.concat([ f(value) ]), [])
}
..
var map = (list, f) =>
list.reduce((result, value) => result.concat([ f(value) ]), [])

Not sure I got your motivation, but would this help?

function fn(f) { return f(this) } // provide 'this' as explicit arg

let map = it => f =>
it.list.reduce((result, value) => result.concat([ f(value) ]), [])

let obj = { map: fn(map), list: [1,2,3] }; // wrap map as method

obj.map(x => x+1);
map( {list:[1,2,3]} )(x => x+1);

Claus


_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to