`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 <[email protected]> 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 <[email protected] 
> <mailto:[email protected]>> 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 <[email protected] 
> <mailto:[email protected]>> 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 <[email protected] 
>> <mailto:[email protected]>> 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
>> [email protected] <mailto:[email protected]>
>> https://mail.mozilla.org/listinfo/es-discuss 
>> <https://mail.mozilla.org/listinfo/es-discuss>
>> 
>> 
>> _______________________________________________
>> es-discuss mailing list
>> [email protected] <mailto:[email protected]>
>> https://mail.mozilla.org/listinfo/es-discuss 
>> <https://mail.mozilla.org/listinfo/es-discuss>
> 

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to