Le 26/09/2013 01:29, François REMY a écrit :
Hi,

TLDR ==> The web needs a way to express executable code that does not rely on 
its parent context, is guaranteed to be side-effect-free, and can be executed 
safely anywhere (even in a different thread/worker/window/device, or as callback 
for browser code being executed while the DOM is not ready to be accessed)
Why "need"? You don't really expose a use case. You only start with "It's been some time I've been working on this idea of a..."

Also, one thing is not really clear to me. Are you trying to protect the function from its caller/loader or the caller from the function? both?

The good thing about those functions, is that they can safely be sent over the 
wires to another thread, or to another web page, because they do not possibly 
rely on any state or context.
This is an interesting use case.
I've come across such a use case when doing MongoDB MapReduce [1]. I was doing Node.js code and unlike in other MongoDB clients, I had the interesting benefit of having syntax coloration for my map and reduce functions:

    // global scope
    var map = '' + function(){
       // map code
    }

(in other language, you have to put the JS in a string and so don't have syntax coloration). Of course, my functions couldn't use any Node.js built-in since they were meant to be serialized to be sent to MongoDB. To be honest, I did fine with this trick. The function being global, I had no temptation to use anything from the parent scope... since there was no parent scope.

At scale, maybe I would have needed a more systematic approach to make sure my functions weren't using non-standard globals. But that can be part of my test infrastructure. I'm pretty sure an Esprima-based tool already exists to find free variables.

In the previous paragraph, I loosely used the word "standard". Indeed, there is no standard JavaScript implementation. There are a bunch of implementations with different levels of conformance to existing standards. For instance, at the time I used MongoDB, it was using an old SpiderMonkey that didn't have Object.keys. I learned this the hard way. In that experience, I learned that one of the things you're trying to achieve (move "standard" code from machine to machine) is somewhat undoable. It's a very context-sensitive problem. Now that MongoDB is using v8, maybe I can use Object.keys, but won't be able to use the non-standard-then-yet-convenient destructuring available in SpiderMonkey.

Also, MongoDB provides to the serialized function a non-standard "emit" function. Your proposal prohibits non-ES6 built-ins, thus preventing such an emit function to be provided (arguably, they should pass this function an argument). I can also easily imagine that if sharing code between two same-version Node.js instances, one may want to be able to use Node.js-specific additional globals.

Is there some interest from anyone else in formalizing this for a future 
version of EcmaScript? Or any comment?
Given my experience with MongoDB, I'm tempted to ask: do we need this at all? A global function (no parent scope) and combined with a tool finding free variables might be enough to cover this use case.

David

[1] http://docs.mongodb.org/manual/core/map-reduce/
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to