it's a great language, once you get past the fact that writing code in the notebook is a horrible experience. You get a great lisp, along with pattern matching and rule replacement.
I can recommend the book by Paul Welling, as well as the books by Michael Trott (very meandering).
Just funking things up in the notebook is the most fun I've been having in a long time. You just get sucked into trying more and more things, adding manipulates around it, playing some more, taking the output image and running image processing on it then converting it to a mesh on which you solve differential equations.
I disagree, I think the notebook is one of the best interfaces I've ever found. Just not for "traditional programming".
The notebook is a literate programming document. It contains my thoughts and process for creating an algorithm/piece of code along with tests and examples. This is very, very different from how people traditionally "program".
However, Mathematica has some very real, very strong deficiencies if you wanted to build an application end-to-end within it. It's dynamically typed, with everything-is-a-list mentality. So you will get type errors.
Unit testing (let alone combinator libraries like quick check) are only available at the higher price levels.
Warning personal opinions ahead!! Wolfram employees often have have strange views on how software is built outside of Wolfram Inc. Unit tests are alien, and type checking or datatypes (Say, to make sure that order your fancy Mathematica based trading system is going to make is sane) are seen as only things dumb rails programmers need. Rather than tools to make developers more powerful.
I would honestly recommend every programmer learn Mathematica. I'm sure they'll find that they can aim far higher when they have the right tools behind them.
It's the same distance again from Python/Ruby as Python/Ruby are from C. Probably more.
> Unit testing ... are only available at the higher price levels.
Actually, this is now available for everyone, something I advocated for. VerificationTest and TestReport are the key functions there.
Good implicit suggestion about QuickCheck.
We've supported unit testing in our Eclipse plugin for years, and with V10 brought the MUnit package into the System context with a redesign of the essential functions.
There's the beginnings of an algebraic type system hiding in 10 (do Get["TypeSystem`"], then try RandomData[Vector[Atom[Integer]]). So generating synthetic data for a function with a given signature is already possible. Now we need to be able to express invariants etc, and then minimize counterexamples.
The notebook is excellent for its intended domain, which is scientific exploration. It is very good to be able to create definitions and change data, having the results immediately visible. Notebooks can also be saved in its current state and exported to other formats.
I can recommend the book by Paul Welling, as well as the books by Michael Trott (very meandering).
Just funking things up in the notebook is the most fun I've been having in a long time. You just get sucked into trying more and more things, adding manipulates around it, playing some more, taking the output image and running image processing on it then converting it to a mesh on which you solve differential equations.