<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div><br>More like</div><div id="AppleMailSignature"><br></div><div id="AppleMailSignature">Foo()# // SyntaxError</div><div id="AppleMailSignature">Foo.bar()# // Foo</div><div id="AppleMailSignature">Foo.bar.baz()# // Foo.bar</div><div id="AppleMailSignature"><br></div><div id="AppleMailSignature">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</div><div><br>On Oct 26, 2015, at 6:11 PM, Edwin Reynoso <<a href="mailto:eorroe@gmail.com">eorroe@gmail.com</a>> wrote:<br><br></div><blockquote type="cite"><div><div dir="ltr"><div class="gmail_default" style="color:rgb(0,0,0)">@CaitIin see what your saying which would simplify things:</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">`foo()#` returns `undefined`</div><div class="gmail_default" style="color:rgb(0,0,0)">`foo.bar.call(baz)#` returns `foo` (correct?)</div><div class="gmail_default" style="color:rgb(0,0,0)">`baz.quux = foo.bind(bar)` returns `baz` (correct?)</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">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)</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">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.</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">So these should throw:</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">`[].length#` // throws</div><div class="gmail_default" style="color:rgb(0,0,0)">`({ foo: 3 }).foo#` // throws </div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">@Adam</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">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</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">BTW I don't think you need the preceding `.` in `with` statements</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">@Eric</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">Other languages having `#` as comments, doesn't matter</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">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:</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">```JS</div><div class="gmail_default" style="color:rgb(0,0,0)">obj.(</div><div class="gmail_default" style="color:rgb(0,0,0)">  f1(),</div><div class="gmail_default" style="color:rgb(0,0,0)">  f2()</div><div class="gmail_default" style="color:rgb(0,0,0)">);</div><div class="gmail_default" style="color:rgb(0,0,0)">```</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">Compare that to:</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">```JS</div><div class="gmail_default" style="color:rgb(0,0,0)">obj</div><div class="gmail_default" style="color:rgb(0,0,0)"> .f1()</div><div class="gmail_default" style="color:rgb(0,0,0)"> #f2()</div><div class="gmail_default" style="color:rgb(0,0,0)">```</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">There's extra parentheses and having a comma, also there's already a comma operator, not sure if that will confuse things.</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">@Erik</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">That's a nice syntax I suppose</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">@Bergi</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">No, the method being called is actually `bar`, but using `call` calls the method `bar` with a different `this` value.</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">@Bob</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">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.</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">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:</div><div class="gmail_default" style="color:rgb(0,0,0)"><br></div><div class="gmail_default" style="color:rgb(0,0,0)">1. No API methods have to be changed, to do accomplish this</div><div class="gmail_default" style="color:rgb(0,0,0)">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.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Oct 26, 2015 at 1:05 PM, Bob Myers <span dir="ltr"><<a href="mailto:rtm@gol.com" target="_blank">rtm@gol.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">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.<div><br></div><div>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.</div><div><br></div><div>Here, I'm really having a hard time trying to figure out what's so painful about</div><div><br></div><div>    obj.foo();</div><div>    obj.bar();</div><div><br></div><div>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.</div><div><br></div><div>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</div><div><br></div><div>    return <foo(#5)>;</div><div><br></div><div>In other words, call `foo(5)`, but deem the expression to evaluate to 5 and return that.</div><div><br></div><div>The proposed `obj.foo()#.bar()` could be written as</div><div><br></div><div>    <#obj.foo()>.bar();</div><div><br></div><div>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.</div><div><br></div><div>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.</div><div><br></div><div>I mean, if you want to write chainable functions, then just write them that way. </div><div><br></div><div>If you have non-chainable functions, and you want to make them chainable/cascadable, it's not a real problem to chainify a function:</div><div><br></div><div>    function chainify(fn) {</div><div>      return function() {</div><div>        void fn.apply(this, arguments);</div><div>        return this;</div><div>      };</div><div>    }</div><div><br></div><div>    obj.doSomethingChained = chainify(obj.doSomething);</div><div>    obj.doSomethingChained().doSomething2();</div><div><br></div><div>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:<br></div><div><br></div><div>    chainifyAll(obj);</div><div><br></div><div>which would create methods xxxChained for all methods on the object.</div><div><br></div><div>--</div><div>Bob</div></div>
<br>_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br></blockquote></div><br></div>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>es-discuss mailing list</span><br><span><a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a></span><br><span><a href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a></span><br></div></blockquote></body></html>