No, you’d just memoise it to a variable:


  a?.d().f?.b




to:




  var _temp, _temp2;

  (a != undefined ? (temp = a.d() != undefined ? (_temp2 = _temp.f != undefined 
? _temp2.b : undefined) : undefined)));




You’re going to need to memoise all member expressions anyway as they might be 
accessing a getter and you don’t want to call it twice.

On Tue, Apr 7, 2015 at 7:32 PM, joe <[email protected]> wrote:

> Okay.  I've updated my transpiler to demonstrate how (and why) this could
> work at the VM level (I do think VM devs will have to add new opcodes for
> this), and I've appended an example transformation to this email.
> Why is this so complicationed?  The answer is that when you start nesting
> ?. operators, it's pretty easy to cause some operators to be called twice.
> E.g, if you transformed the following to the NULL syntax:
>   a?.d().f?.b
> You would get:
>   (a != undefined ? (a.d() != undefined ? (a.d().f != undefined ? a.d().f.b
> : undefined) : undefined)));
> Notice how a.d() gets called multiple times.
> The solution is probably new VM opcodes.  Since my transpiler is obviously
> not a VM, it transforms ?. operators into auto-generated functions.
> Anyway, here's the example I transpiler:
>     a?.b.c.e?.f.g?.h.t.c?.d()?.e;
> Which turned into this:
>    function q0eILlfx7_3(obj) {
>     var _t=obj;
>     if (_t==undefined)
>       return undefined;
>     _t = _t.b.c.e;
>     if (_t==undefined)
>       return undefined;
>     _t = _t.f.g;
>     if (_t==undefined)
>       return undefined;
>     _t = _t.h.t.c;
>     if (_t==undefined)
>       return undefined;
>     _t = _t.d();
>     return _t;
>   }
>   q0eILlfx7_3(a);
> On Tue, Apr 7, 2015 at 6:24 PM, Brendan Eich <[email protected]> wrote:
>> joe wrote:
>>
>>> That's a good point.  Are lexical non-DFA grammars allowed?  It would be
>>> trivial to solve that with a regular expression lookahead.  Although I
>>> suppose at that point you might as well call it a cover grammar.
>>>
>>
>> We must avoid being too clever -- it complicates implementations and
>> inevitably incurs future-hostility to extensions we may want, if not
>> outright bugginess.
>>
>> All of this suggests prefix ? is the better course. Anyone have
>> counterexamples?
>>
>> /be
>>
>>>
>>> Joe
>>>
>>> On Mon, Apr 6, 2015 at 2:42 PM, Brendan Eich <[email protected]
>>> <mailto:[email protected]>> wrote:
>>>
>>>     joe wrote:
>>>
>>>         By the way, I don't remember having grammar issues (I use a
>>>         LALR compiler-compiler).  Looking at my code, it looked like I
>>>         handled it in the tokenizer stage; I added a COND_DOT token:
>>>
>>>         COND_DOT : \?\.
>>>
>>>
>>>     Did you keep backward compatibility? `x?.1:y` must continue to work.
>>>
>>>     /be
>>>
>>>
>>> No, it looks like I didn't.
>>>
>>
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to