I want to throw another point in for LISP's. I've spent quite some time now learning Clojure to augment my usual Java tomfooolery and I have to say that after some practice I've been finding myself able to write more with less. But before I get into that:
I've played with C, C++, C#, JavaScript, Racket, Python, heck even MIPS and x86 for a time too. The biggest reason I stuck with Java over adopting any of those alternatives (except where specific situations warranted their use, and in fact my first language was C so I still hold a soft spot in my heart for it) was specifically because they didn't improve my productivity at all. In fact they slowed me down simply because I didn't know the standard libraries. Although I don't believe this truly counts as a legitimate "slow down" because if I were more experienced in any of those other options then I wouldn't be any slower with them than I would be with Java (except maybe the assembly languages
).
I mean I could write up my own instances of the data structures I needed, or parsing libraries, networking and io libraries too, but it kind of defeats the purpose of having "standard libraries" right? And since I have become very familiar with Java and it's countless libraries, why spend the brain power hacking away in those other languages? My problem solving methodology remains entirely unchanged so 90% of the time, the code I wrote in one language I could almost completely transcribe into another (this is especially true with Java and C# because even their syntax and choice of keywords is almost identical haha). As far as this family of languages is concerned, my opinion pretty much is that you're going to be the most productive in the language with the most tools for you to be productive with (read: lazy). Typically this is going to mean "who's got the most useful libraries for me to take advantage of".
Back to Clojure; what's so special about it? For those who may recall my frustration with the language when I originally picked it up, it was worth the headaches and here's why:
Languages, both computer and human/linguistic, as well as Mathematics are ways of expressing human thought. Human languages specifically allow us to transmit ideas to one another in very complex and abstract ways which can be difficult to express in terms of Computer Languages or Mathematics. One of the issues with Human languages though is that they're rather static. You generally can't take expressive shortcuts like say recursion in CS/Math. This is where Mathematics has come in. Ultimately mathematics is very much just the short hand abbreviations for what was once written out in sentence form. There are more shortcuts that you can take to encompass wider sets of ideas this is what makes it so useful still today. Next came programming languages which are so immensely powerful in their own right because they allow us to go so far as to automate human thought! You can now string together lines of Mathematical expression, which was already a short hand for spoken languages, in order to produce machines that can just flat out replace a human. The efficiency gains are enormous and we see them every day! Dealing with ATM's is way faster and way cheaper than dealing with human tellers in a brick and mortar bank as a for example.
So what does this have to do with LISP's? More specifically Clojure? So I'll admit, LISPs are hard to pick up at first... especially if you've become ingrained in the ways of Declarative and/or Imperative programming (as I most definitely was)... but what makes them special is that they let you do things that you would otherwise have to do "the long way" much like what mathematical symbols did for written word and later programming for mathematics. The more pure functional languages like Common Lisp, Scheme, or Haskell in a sense allow you to automate your automation. This is why LISP's have stuck around for as long as they have, but they do still have there share of problems, which is why they never gained enough traction to ever take over the world. Clojure gets a lot of slack from the "pure" Lisp community for being so middle of the road in terms of "Lisp purity" but I think that's what makes it so much more productive to use. It's flexible. It's got most of the fluff that you have in a "pure" Lisp while still allowing you to escape from those shackles when you need to. I believe this is why Ruby, which was mentioned a few times already) is so popular too. It has a lot of functional programming influence in it but it isn't "pure". Neither Clojure, nor Ruby, are tied down to their religion like Haskell is, lovely a religion though that it may be. Clojure is also convenient because of the interop with Java means I can use libraries when I need/want to instead of writing it myself after finding out another Clojurian hasn't written it for me. And Ruby is popular enough that it doesn't have that much so much anymore (at least I presume so; I can't speak from experience on that one). Basically, you have your productivity gains from libraries/tools that you'd see in any of the other previously listed languages, as well as from the "magic" that is Functional Programming.
Long story short: my vote goes to Clojure in terms of productivity. But then, that's just my opinion. To each their own
.
Edited by mbcev, 14 March 2013 - 01:15 PM.