Very cool project!
I know that this is somewhat off topic, but I'm thinking about this from the perspective of the ClojureScript compiler. The translation snippets in the Lua.js README make me really thankful for the design of Clojure. It's highly amenable to compilation. As a result ClojureScript is able to produce extremely well optimized output. For simple cases, the translation is no more unreadable than CoffeeScript. But even for complex cases, the performance is excellent because most forms compile to relatively plain & boring javascript.
Lua init(1, 2, 3)
Lua.js lua_call(lua_tableget(lua_script, "init"), [1, 2, 3]);
CLJ (init 1 2 3)
CLJS cljs.user.init.call(null, 1, 2, 3)
Note that cljs.user is the default namespace in the ClojureScript REPL.
Lua local numActive = activeChars.count
Lua.js var numActive = lua_tableget(lua_tableget(lua_script, "activeChars"), "count")[0];
CLJ (let [num-active (.-count active-chars)])
CLJS var num_active__10317 = cljs.user.active_chars.count;
Lua local distFromCenter = get_distance({x=1, y=2})
Lua.js var distFromCenter = lua_call(lua_tableget(lua_script, "get_distance"), [lua_newtable(null, "x", 1, "y", 2)])[0];
CLJ (let [distance-from-center (get-distance {:x 1 :y 2})])
CLJS var distance_from_center__10322 = cljs.user.get_distance.call(null, cljs.core.ObjMap.fromObject(["\ufdd0'x", "\ufdd0'y"], {"\ufdd0'x":1, "\ufdd0'y":2}));
Lua.js wins on that last example, but if you need more speed, you can get it. All of the JavaScript primitives are exposed with highly performant macros:
CLJ (aget (js-obj "x" 1 "y" 2) "x")
CLJS ({"x":1, "y":2}["x"])