-
Notifications
You must be signed in to change notification settings - Fork 2k
Description
previous issues:
http://github.com/jashkenas/coffee-script/issuesearch?state=closed&q=narrative#issue/241
http://github.com/jashkenas/coffee-script/issuesearch?state=closed&q=defer#issue/287
So, it's back!
For those who didn't read or can't remember the previous discussions, I have been working on adding a "defer" semantic into coffee-script. This is aimed at making asynchronous coffee-script less painful, by providing a continuation-like callback object for the current function (at compile-time).
For example:
myfunc: (cb) ->
data: defer call_some_ajax('/path/to/relevant/data')
alert("got $data")
cb(data)
Would be transformed into the following javascript (or its equivalent):
function myfunc(cb) {
call_some_ajax('/path/to/relevant/data', function(data) {
alert("got" + data);
cb(data);
});
}
Special care has been taken such that the following use-cases work as expected:
- multiple return arguments (
[err, result]: defer some_call()
) - defer calls within:
- if/else statements
- switch statements
- for loops
- while loops
- nested expressions.
These are non-trivial, so there may be bugs if you do something utterly weird - let me know! ;)
So, please do check out my deferred branch (http://github.com/gfxmonk/coffee-script/tree/deferred) and let me know what you think. Is it a good idea? Should it be (eventually, after some more cleanup) merged into master? Are there any glaring omissions or bugs? Be sure to look at test/test_deferred.coffee, it has over 30 different tests ensuring that as many language features as I could think of work when defers appear in various locations.
(note that the tests in this branch rely on my coffee testing project, coffee-spec (http://github.com/gfxmonk/coffee-spec). I couldn't have managed this many complex tests without it, and it's hopefully coming to coffee-script itself officially sometime soon)
Stuff not yet done
- I have not yet added the ability to use
defer
in place of a positional argument - it shouldn't be too hard though. - There's a fair bit of cleanup that can be done on the code, as well as some possible optimisations on the output of code - I was going for correctness, not efficiency.
- Some form of trampolining to prevent the stack growing indefinitely. This is easy enough to do manually, and I still have no idea how often it will be necessary.
- (potentially) adding a callback argument to a function definition when the compiler detects that one is required. This was a controversial suggestion in my first proposal, so it's been left out for now.
So... thoughts?