I think this could be implemented with no regard to the function implementation, which would treat functions with and without a lexical `this` identically.
@Caitlin I have similar doubts. Also, I don't particularly like the look of the `#` syntax. It looks too Perl-ish. On Mon, Oct 26, 2015, 18:28 Caitlin Potter <caitpotte...@gmail.com> wrote: > `foo()#` would best throw an early error — theres no syntactically > apparent `this`, so cascading doesn’t add anything useful. > > `foo.bar.call(baz)#` would return `foo.bar`, as the method being invoked > is `call`, and `foo.bar` is the `this` for that method. > > `baz.quux = foo.bind(bar); baz.quux()#` would return `baz`, yes. > > But, here’s the issue — it still doesn’t deal with callable objects with a > lexical `this`, like arrow functions — and of course it > doesn’t help much with bound functions. So, you can get misleading results > with the cascading operator in JS, even in this > dramatically simplified form. > > I don’t really expect that this proposal (with these gotchas) would be > able to reach consensus and make it into a ratified specification. > > > On Oct 26, 2015, at 6:21 PM, Edwin Reynoso <eor...@gmail.com> wrote: > > @Caitlin yea that's correct, but you didn't compare what I had typed out: > > `foo()#` returns `undefined` > > `foo.bar.call(baz)#` returns `foo` (correct?) > > `baz.quux = foo.bind(bar)` returns `baz` (correct?) > > @Erik > > but what happens when a method returns a Number > > `5..toString();` // works in ES5 because the first `.` is for the decimal > > On Mon, Oct 26, 2015 at 6:16 PM, Caitlin Potter <caitpotte...@gmail.com> > wrote: > >> >> More like >> >> Foo()# // SyntaxError >> Foo.bar()# // Foo >> Foo.bar.baz()# // Foo.bar >> >> The super property thing is a harder problem. They would always return >> `this` i guess, but I'm not sure if chaining a super method should lookup a >> method in the prototype first, or instance first >> >> On Oct 26, 2015, at 6:11 PM, Edwin Reynoso <eor...@gmail.com> wrote: >> >> @CaitIin see what your saying which would simplify things: >> >> `foo()#` returns `undefined` >> `foo.bar.call(baz)#` returns `foo` (correct?) >> `baz.quux = foo.bind(bar)` returns `baz` (correct?) >> >> and as for property accessors I think they should throw, it should only >> be for function calls, because why after getting a property would you want >> to get the object back? The only reason I can think of is that its a getter >> and it does have a side effect (which in my opinion its just a bad idea) >> >> Take `[].length` why would you actually type out `.length` if you don't >> want it, compare to a function call which it should have a side effect. >> >> So these should throw: >> >> `[].length#` // throws >> `({ foo: 3 }).foo#` // throws >> >> @Adam >> >> I'm not sure about that, not sure if `with()` would be brought back to >> "good use" (I kind of always liked it) but interesting thought >> >> BTW I don't think you need the preceding `.` in `with` statements >> >> @Eric >> >> Other languages having `#` as comments, doesn't matter >> >> I don't really like that syntax because this is how it would look if you >> had it in different lines, but that's not really up to me: >> >> ```JS >> obj.( >> f1(), >> f2() >> ); >> ``` >> >> Compare that to: >> >> ```JS >> obj >> .f1() >> #f2() >> ``` >> >> There's extra parentheses and having a comma, also there's already a >> comma operator, not sure if that will confuse things. >> >> @Erik >> >> That's a nice syntax I suppose >> >> @Bergi >> >> No, the method being called is actually `bar`, but using `call` calls the >> method `bar` with a different `this` value. >> >> @Bob >> >> I see what your saying that's actually an idea I had first, just not that >> syntax, but that's true if the APIs are ones you wrote, there are lots of >> APIs that are out there already and may have functions that return other >> values that you may or may not need. >> >> Yea you could use that chainify function easily if you were the one >> writing the API, but like I said above, there are methods already that may >> return something, and what they return is useful, but sometimes you may not >> need them. They could have a parameter as to what to return but that just >> complicates things, having a way to do this in the languages means 2 things: >> >> 1. No API methods have to be changed, to do accomplish this >> 2. APIs can then return something else, and JS can always provide a way >> to return the object back, instead of the API having to do it. >> >> On Mon, Oct 26, 2015 at 1:05 PM, Bob Myers <r...@gol.com> wrote: >> >>> I love cool syntactic innovations as much as the next guy. I'm sure >>> there are a bunch sitting out there waiting to be discovered that will make >>> us all sit back in awe. >>> >>> But it's not a particularly new insight to observe that especially if >>> they introduce no new basic functionality and are just sugar, then such >>> innovations have to solve a real pain point, not have simple user-side >>> solutions, and not eat too much into the syntactic space for better future >>> ideas. >>> >>> Here, I'm really having a hard time trying to figure out what's so >>> painful about >>> >>> obj.foo(); >>> obj.bar(); >>> >>> that would lead us to introduce `.{` or `..` or `#.` to solve the >>> problem of typing `obj` twice. The resulting code (whether >>> `obj.foo()..bar()` or `obj.{foo(); bar()}` or `obj.foo()#.bar()`) is >>> neither more writable, nor more readable, nor more maintainable, nor more >>> provably correct. On the contrary. All are more obtuse, obscure, and >>> bug-prone. >>> >>> As a semi-ridiculous example of a seemingly useful new syntactic >>> structure, let me introduce the `<#>` syntax. This is a mechanism for >>> writing an expression, enclosed in `<>`, which throws away its value and >>> instead evaluates to a value within the expression prefixed by a >>> (tightly-bound) `#` operator. So, for instance, I can write >>> >>> return <foo(#5)>; >>> >>> In other words, call `foo(5)`, but deem the expression to evaluate to 5 >>> and return that. >>> >>> The proposed `obj.foo()#.bar()` could be written as >>> >>> <#obj.foo()>.bar(); >>> >>> I have no trouble imagining that this syntax could result in some more >>> compact code, but I doubt if it would be more writable or readable. It's >>> syntactic over-think. >>> >>> Another criteria for accepting new syntax ideas is that they should be >>> general and compositional. In other words, they should solve more than one >>> problem. Solving the single problem of "take a method call on an object and >>> fix it up so that later stuff in the expression refers to the object >>> instead of the result of the method call" does not meet this criteria. >>> >>> I mean, if you want to write chainable functions, then just write them >>> that way. >>> >>> If you have non-chainable functions, and you want to make them >>> chainable/cascadable, it's not a real problem to chainify a function: >>> >>> function chainify(fn) { >>> return function() { >>> void fn.apply(this, arguments); >>> return this; >>> }; >>> } >>> >>> obj.doSomethingChained = chainify(obj.doSomething); >>> obj.doSomethingChained().doSomething2(); >>> >>> If you have a whole set of APIs you want to chainify, you could take a >>> leaf from the `promisifyAll` paradigm, and do it all at once: >>> >>> chainifyAll(obj); >>> >>> which would create methods xxxChained for all methods on the object. >>> >>> -- >>> Bob >>> >>> _______________________________________________ >>> 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 >> >> > > _______________________________________________ > 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