Static local variables

myemailum14 at gmail.com myemailum14 at gmail.com
Mon Aug 10 17:33:54 UTC 2015


Look at it this way

a = a + 1

is same as

a += 1

then it feels natural to say the same thing

a = a || 1

a ||= 1

then you can extend it like this

a ||= var1 || var 2 || var 3



On Mon, Aug 10, 2015 at 12:16 PM, joe <joeedh at gmail.com> wrote:

> I've been hesitant to bring up this idea, because even though I use it
> extensively as a language extension in my transpiler I'm not sure it is
> normatively correct.
>
> When I started my first major JS project four or five years ago, I noticed
> I was doing this a lot:
>
>     var intersect_vector_tmp = new Vector();
>
>     function intersect_vector(v1, v2) {
>         var tmp = intersect_vector_tmp .load(v1).sub(v2);
>         //do something
>         v1.add(tmp);
>     }
>
> Basically, I was doing the following transform:
>
> *  For each static local variable...
>     1. Build unique name from hash of lexical scope chain
>     2. Rename variable (along with references to it in the local hoisted
> scope).
>     3. Move it to module/global namespace.
>
> I ended up implemented this in my compiler as a sort of C-style static
> local variable.  Thus, the example above became:
>
>     function intersect_vector(v1, v2) {
>
>         static tmp = new Vector();
>
>         tmp.load(v1).sub(v2);
>         //do something
>         v1.add(tmp);
>     }
>
> There are, obviously, a great many problems here, starting with the fact
> that the variable's initializers are being evaluated outside of the scope
> they were declared in.  Unfortunately this pattern can be hard to avoid for
> high-performance code, so much so that if the transformation is done by
> hand you end up with a great deal of clutter.  This is especially annoying
> when dealing with classes, as the following file (with the statics
> transpiled out) illustrates:
>
>
> https://github.com/joeedh/fairmotion/blob/master/examples/vectormath_static_illustration.js
>
> This becomes a real pain after a while.  At one point I tried using shared
> object pools, but found that this didn't remove very much clutter because,
> in practice, each function had to have its own pool (usually one for each
> type of temporary object it uses).  This really does boil down to a lack of
> support for local stack allocation of temporary objects.
>
> Anyway, I just thought I'd put this out there. Who knows, maybe someone
> will invent perfect escape analysis for temporary const objects, and we
> won't need hackish language extensions such as this.
>
> What do people think? Too many normative problems?
>
> Best,
> Joe
>
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20150810/50177a83/attachment.html>


More information about the es-discuss mailing list