Hi there! Scala.js author and lead maintainer here. I saw this on Twitter, and I’ll just answer with some facts about Scala.js.
Scala.js also uses Google Closure automatically in production builds. We use it in a different way than CLJS, though: CLJS chooses to interact particularly well with Closure-aware libraries, which allows to dead code eliminate across the JS libraries and the CLJS code. However, it means that for some JS libs that are not designed for Closure, additional externs and exports annotations may be necessary to preserve semantics. In Scala.js, we want to guarantee semantics at all cost, and don’t require users to add any annotation. However that means that we only let Closure run on our code, and not across JS dependencies.
[/quote]
Scala also uses immutable data structures by default.
Scala for the JVM has a very good REPL. However, there is no REPL in Scala.js, because of technical difficulties linked to core design choices (there are tradeoffs at play here).
CLJS is clearly ahead of us here.
Also available in Scala/JVM and Scala.js.
Of course Scala favors static typing, and Scala users typically assume static typing is an advantage. Nevertheless, sometimes interoperability with JavaScript–although usually statically typed in Scala.js–calls for a bit if dynamism. That’s why we have a js.Dynamic
type.
Cheers everyone, I love that CLJS exists and gives us such hard yet friendly competition
Sébastien