Benefits of Learning Clojure?

Recently, I've been looking to Clojure and I've found information like: "What is Clojure Useful For?". While it appears Clojure can do 'everything' why would/should one learn/use Clojure? What does it have to offer over any other JVM (or otherwise) based language? Also, my background is with Java, Groovy, Ruby, and more recently Scala, how difficult will it be for me to pickup Clojure? What hurdles do you think I will encounter? Thanks.

The answers in the other thread were helpful. I do have a follow-up question however. Being as that I'm new to functional programming, does it make sense to start my learning with Clojure or some other 'functional' language?

While there's a lot more "classic" information out there based on Scheme and/or Common Lisp (e.g., SICP, On Lisp), I think if you're coming from Java and you're happy to work from any one of the great new books on Clojure, then Clojure is a natural choice to learn functional programming. One of the benefits in my mind is that you can mix little bits of Clojure into your day-to-day Java work, which you can't do with older functional languages.

Sean Corfield wrote:While there's a lot more "classic" information out there based on Scheme and/or Common Lisp (e.g., SICP, On Lisp), I think if you're coming from Java and you're happy to work from any one of the great new books on Clojure, then Clojure is a natural choice to learn functional programming. One of the benefits in my mind is that you can mix little bits of Clojure into your day-to-day Java work, which you can't do with older functional languages.

Keeping benefits in mind, under what situations does Clojure excel/shine? For example, while I could use Groovy for 'everything', I often use it when prototyping, creating GUIs, or developing web apps since (in my opinion) it makes completing the task(s) considerably easier.

Dan King wrote:Keeping benefits in mind, under what situations does Clojure excel/shine? For example, while I could use Groovy for 'everything', I often use it when prototyping, creating GUIs, or developing web apps since (in my opinion) it makes completing the task(s) considerably easier.

I used Groovy extensively in 2008 and it's a great language as a "better Java" if you want something that's very similar to Java but works like a dynamic scripting language with some very useful features that Java doesn't have. My team built a Spring / Hibernate application with Groovy that acted as the back end to a desktop collaboration application and a mobile web app. But Groovy really isn't that different to Java so you get most of the same "problems" that are inherent in OO systems: mutable state, painful concurrency, conflation of state and identity and so on (assuming you accept there are downsides to OO, of course )

I find Clojure very productive for prototyping since I can work with code at the REPL, directly inside my IDE, and build solutions iteratively and quickly - treating Clojure as a dynamic scripting language, no doubt much like you use Groovy.

Where I find Clojure shines is when working across data sets where I can leverage map / reduce / filter and the easy composition of small, reusable functions and, in particular, high-order functions. I'm finding that the expressiveness makes me more productive than when working with other languages yet the Java interop makes it easy to leverage, and work with, existing Java code and libraries. Immutable data means easy concurrency and easier testing as well.

Like Groovy, Clojure is intended to be a general purpose programming language, as John notes in his response.

Dan King
Ranch Hand

Joined: Mar 18, 2009
Posts: 84

posted May 27, 2011 07:36:08

0

Sean Corfield wrote:I find Clojure very productive for prototyping since I can work with code at the REPL, directly inside my IDE, and build solutions iteratively and quickly - treating Clojure as a dynamic scripting language, no doubt much like you use Groovy.

Where I find Clojure shines is when working across data sets where I can leverage map / reduce / filter and the easy composition of small, reusable functions and, in particular, high-order functions. I'm finding that the expressiveness makes me more productive than when working with other languages yet the Java interop makes it easy to leverage, and work with, existing Java code and libraries. Immutable data means easy concurrency and easier testing as well.

Like Groovy, Clojure is intended to be a general purpose programming language, as John notes in his response.

Sean, you've convinced me of the benefits of learning Clojure; now that you have, can you suggest how I should go about it? Should I use clojure 1.2 RC3 or 'clojure box'? Based on tools/plugins available should I go with eclipse, netbeans or another? Any other suggestions you may have are appreciated.

By the way, thanks for all the well thought-out and expressed answers; they've been very helpful.

Dan King wrote:Sean, you've convinced me of the benefits of learning Clojure; now that you have, can you suggest how I should go about it? Should I use clojure 1.2 RC3 or 'clojure box'? Based on tools/plugins available should I go with eclipse, netbeans or another? Any other suggestions you may have are appreciated.

The easiest way to get up and running in my opinion is via Leiningen which is a Clojure build tool that wraps Maven. Installation is just a matter of:

Download the lein script, make it executable and put it on your path

Run lein self-install once to fetch the later Leiningen JARs

Run lein new myprojectname to create a Clojure project in the folder myprojectname

Inside that folder, lein deps will pull down the appropriate libraries (Clojure 1.2.1 by default), lein test will run any tests you've written, lein run should run your main Clojure program

As for IDE choices, I'd stick with whatever Java IDE you like and just add the Clojure plugin for it. NetBeans, IntelliJ and Eclipse all have plugins that are being actively developed. I use Eclipse and CounterClockWise and really like that (esp. in Strict Structural Mode so it takes care of balancing parentheses for me). I've tried IntelliJ and NetBeans but I just couldn't get settled with them so I can't comment on how slick their Clojure plugins are.

For downloads in general, the main Clojure downloads page has a list of the official versions (although it's missing Clojure 1.2.1 - but Leiningen will handle that for you). That page also shows how to configure the dependencies for Leiningen. FWIW, I'm running 1.3.0 Alpha 7 because I like life on the bleeding edge (and I'm relying on some 1.3.0 features - as well as being the maintainer for clojure.java.jdbc, the 1.3.0 equivalent of clojure.contrib.sql from earlier versions).

If you do decide to jump to 1.3.0, you'll need to deal with the "contrib" libraries in a different way. Feel free to start a new thread or contact me directly if you go that route and need some guidance.

By the way, thanks for all the well thought-out and expressed answers; they've been very helpful.

I'm glad folks are finding it helpful. I feel like I'm swamping the forums right now but I want to make sure everyone gets their questions answered and I'm a huge fan of the JVM ecosystem (even if I'm not such a fan of the Java language itself).