Lists of the "best of..." always carry with them a sense debate. Before we can build such a list, first we need to answer the obvious question: best in what way?
This is my list of languages you should learn because their best feature is that they make you learn. To come out on top of this category, a language should have:
- Strong, easily-available documentation
- Healthy community of contributors who are open to questions
- Language features which are powerful, but might stretch the brain of the programmer
Clojure
If you've never learned a LISP dialect, grab one and try it. Just when it looks like LISP is about disappear in a puff of parentheses, another dialect emerges that offers even more promise than the last. Foremost these days is Clojure, and there's little surprise why it's such a golden child.
Clojure's straightforward abstraction over sequences, and its creators' interests in abstracting other domains such as time(video) and interfaces, gives programmers new ideas to chew on that could influence their own code.
Built on top of the JVM, Clojure immediately has access to a wealth of existing libraries. It also has access to a lot of up-and-coming concurrency primitives. Its embrace of software transactional memory (or STM) is a double-edged sword, though, as it gives programmers a playground to use this research topic in real world applications, but it's still relatively unproven under various loads.
Still, with each version trying to be more profound than the last, Clojure is sure to give you some new tricks and some new ways of thinking.
Alternatively, if you're not interested in the JVM or concurrency, grab a copy of DrRacket or another Scheme. You'll still get the LISP experience. As a bonus, there are a number of books to get you started.
Factor
Once you've worked your way through thinking of programs as lists, it's time to move to stacks. Drawing inspiration from Forth, Factor a modern stack-based language with a highly-optimized run-time and tightly-knit community of fans.
In short order, once you start using Factor, your brain will stretch. Using the stack as an abstraction allows for seemingly impossible concision, but to be able to even read such feats, you'll be spending hours in the Listener (pictured to the left) trying out different functions (called 'words' in Factor) to see what they do and how they affect elements on the stack.
Because of Factor's simple syntax, domain specific languages are a natural fit. In fact, some look nearly identical to textbook examples. That's not to say Factor is without its contortions, but luckily the creators have seen fit to add syntactic sugar to help with that regard (like, for example, allowing you to name elements on the stack and refer to them later).
In short, Factor is well worth the time. Doubly so for those interested in languages from a research point of view, as Factor is on the cutting edge of what's possible in efficiency in dynamically typed languages.
Haskell
How could I not mention Haskell? In less than a decade Haskell has risen from relative obscurity to a name most programmers have heard, even if they haven't tried it. Few languages have garnered this kind of name recognition. Who hasn't heard of monads? They're the scary 700-lbs gorilla of this whole way of programming, right?
The reason to learn Haskell is almost philosophical at this point, and that's so you won't be afraid of it. What are the main parts of Haskell that seem to scare people?
- Type system - It's not only statically typed, but you might say it's thoroughly typed. On the plus side, Haskell uses it for everything from testing, error-checking, interface conformance, and even automatic test generation. Yet it forces you to be honest about everything your function does. Some people see this as restricting, being so open. Other see it as liberating. You should at least try it for a while to see what you think.
- Monads - The gorilla we mentioned earlier. Luckily there are tutorials that can help tame it down to reasonable size. Whether you like them, or not, you'll be able to see how they're used and why they might be useful in various situations.
- Vocabulary - As if monads weren't enough, you're likely to see words like functor, category theory, and catamorphism. The trick is to look at those as just "more gorillas" that you can work with and understand.
Each of these languages offers fertile ground to explore for weeks, months, and even years, and there's enough there to entertain you, amuse you, and possibly even teach you something new. If you have other suggestions for languages, and why they might stretch your brain, post them in the comments.

