I am the author of the original core.matrix for Clojure. Therefore, I have a clear affinity and much more knowledge in this particular space. However, I will still try to give you an honest answer :-)
I was in the same position as a year ago, looking for a solution for numerical computing that would be scalable, flexible, and suitable for deployment as a cluster cloud service.
I ended up with Clojure for the following reasons:
- Functional programming : Clojure is a functional programming language at heart, more than most other languages (although not as many as Haskell ....). Lazy infinite sequences, constant data structures, immutability, etc. Makes for elegant code when you are dealing with large calculations.
- Metaprogramming . I saw the need for code generation for vector / computational experiments. Consequently, Lisp was a big plus: after you did the code generation in a homokino-language using the “whole language” macro system, it’s hard to find anything else that is close.
- Concurrency - Clojure has an impressive and agile multicode concurrency approach. If you have not seen it, see: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
- Interactive REPL . Something that I always felt is very important for working with data. You want to be able to work with your code / data "alive" to get a real idea of its properties. Having a dynamically typed language with interactive REPL does wonders here.
- JVM-based : A big advantage for pragmatic goals due to the huge library / tool ecosystem and the excellent JVM engineering as a runtime.
- Community . I have seen a lot of innovation in Clojure, especially around the common area of data and analytics.
The main drawback of Clojure at that time was a good library / API for matrix operations. At Incanter , but they were not a very common goal or performer. So I started developing core.matrix, which is formed before the idiomatic Clojure-fraudulent equivalent of NumPY / SciPY. It is still working now, but good enough for production if you are careful.
In terms of supporting low-level matrices, I also support vectorz-clj , which is my attempt to provide a core.mattrix implementation that offers high-performance vector / matrix operations while remaining pure Pure Java (i.e. without native dependencies). If you are interested in doing this, you might like:
My second choice after Clojure would be Scala. I liked Scala a bit more maturity and a decent static type system. Both languages are JVM based, so the library / tool side was a tie. These were probably the Lisp functions that supported it.
source share