MatLisp: A library for scientific computation in Common Lisp
github.com
github.com
Similar experience to yours, Mandus.
(oh, post-doc in computational biology, which should qualify as one branch of computationally heavy science)
The other two posts are right about the main differentiators.
Basically, I'm just not sure where to start with such a large project. Currently I'm just trying to learn the language and ecosystem (how the FFI works, etc.) to the point where something like this may be feasible. I want to switch over to using scheme as my de-facto language, and this would be the number 1 library that would make it possible; Unfortunately, the lack of resources on the web for learning how to make good lisp-like APIs is lacking, and I really need some help figuring out how to do it. Unlike Python, we don't have PEP 8, and I think the difficulty in constructing a domain specific language for numerics is under-appreciated.
Thoughts? Tips? It seems MatLisp has been around for some time (2000, I guess?), so there's got to be someone with considerable experience here, right?
That said, I'd recommend checking out Numpy, and projects in lisp lisp scmutils, lisp-matrix, matlisp, femlisp...
The biggest concern I have with re-implementing Numpy in Scheme / Lisp is that it's very object oriented. Certainly, many of the ufunc methods in Numpy can be composed or chained in a very functional style, but at its core Numpy is Pythonic, and Pythonic code means using OOP for abstraction. Mainly, I'm concerned with how one actually transfers this over into Lisp like languages. Sure, CHICKEN has coops, Guile has goops, which are basically Common Lisps' CLOS, but taking the concept of Numpy and expressing it in a CLOS-like system sometimes just feels wrong.
That said, I think the guys behind clojure.core.matrix have done some work facing similar challenges, but I don't really know enough to evaluate if they've done the right thing. Moreover, Clojure itself almost makes this job easier, because it has interfaces / protocols from the get-go, whereas Scheme and CL don't quite share the same properties.
In any case, thanks again for your reply. If you ever write anything regarding those 4 rewrites, or if you have written anything regarding your decisions on refactoring and improving an API, I'd love to read it. I know a lot of people hold Numpy up as a gold standard, but I still find it very hard to put in explicit terms what makes programming with Numpy arrays more pleasant than using MATLAB arrays, Eigen (C++) matrices / vectors, or other similar systems.
I think getting the slicing sematics right is crucial for making things easy, and without an infix reader it is hard, for a Lisp to compete on usability in Numerical computing.
So, although lisp might have been great, in the end I stayed with Python/C++. Guess I'm not the only one with similar experiences.
Thankfully, however, one can tweak it in so astonishing a way - I still miss parameterized types though - that once you realize the nature of your problem, and put in lots of due work, things tend to become easy in the long run; I particularly adore being able to write iterate macros (adding new "for" clauses").
That said, Matlisp is still in a stage of infancy ("research grade"), and while I welcome contributions, it should be noted that it is not yet a replacement for R/Numpy/MATLAB, atleast not for the casual user.
What we use: C/C++, Matlab, Python, R, Fortran, and the occasional Mathematica. I myself have been getting into Julia.
Although written in C++, it uses MIT-Scheme/guile as the control language. This is a problem because the steep learning curve discourages undergraduate students.
https://en.wikipedia.org/wiki/Learning_curve
MEEP looks interesting. Filed, for future use.
The key point is that if you were to map out different languages along the abstraction level, Lisp sits right in between the realms of low-level programming (e.g. Java) and modelling (e.g. Matlab). [2]
EDIT: added link to the image of languages along the axis of abstraction level
[1] https://kuomarc.wordpress.com/2012/03/05/the-uncommon-lisp-a...
[2] https://kuomarc.files.wordpress.com/2012/03/level-of-or-appr...
The huge amount of libraries for Python, C, C++, and Fortran make them the obvious choice.
Plus functional programming paradigms aren't always the best to do scientific programming. It can be done, but it's really not the right tool for the job, in most cases.
It is a very mature platform, and has an extensive library, including bindings to GSL, LAPACK, and BLAS.
Lush started out as a (differently named) project of Leon Bottou and Yann LeCun, which might serve as an endorsement... :)
I think the last commit on LUSH was from ~2012 (I could be wrong). It also doesn't come with Lexical scope, or CLOS support (again I could be wrong). It is very impressive though.
The classes (and methods) are now "dynamically compiled" -like FEMLISP.