Functional JavaScript: Closure
blog.fogus.me
blog.fogus.me
Thanks for the new book fogus, love TJoC 1 and am eagerly awaiting the sequel.
I ran into this recently while building a "practical" monads library for JavaScript. Each monad and transformer has sync and async variants. The sync variants can't use straight recursion because "deep" monadic binds will result in a blown call stack. The solution was/is to allocate on the heap in terms of an array that acts as a manually operated call stack (I think I essentially implemented a "trampoline" but I'm not 100% certain).
Well, at least one mutating index is convenient:
function forEach (a,f) {
for(var i=0;i<a.length;i++) f(a[i],i,a);
}
After that, you generally wouldn't need more indexes.But does it really require a mutating index?
function forEach (a,f,i) {
var n = i || 0;
f(a[0],n,a);
if(a.length > 1)
forEach(a.slice(1),f,n+1);
}
Array copies aren't particularly efficient, of course, and there are languages with data structures backing arrays for which some similar approach might be efficient, but there it is.I think javascript is INHERENTLY object oriented/imperative but can be functional if you put some effort into it.
http://swannodette.github.io/mori/
Just to avoid confusion: mori the library, as distributed by npm, is already compiled. Building the library itself requires a compile step, but an end-user just needs to load it with a script tag or require("mori").
The ClojureScript compiler only gets involved if you want to hack on mori yourself, as opposed to consuming it as a library.
If the point you're making is that it's implemented with ClojureScript as opposed to JavaScript, the fact is that everything that ClojureScript "does" you can do with hand-written JavaScript, but your hand-rolled solution might not be as generic or efficient (depending on your JS chops).