Recs.
Updated
Clojure is a dialect of Lisp and a functional programming language, it provides access to the Java frameworks.
Read Functional Programming with Clojure.
SpecsUpdate
Pros
Pro Simplicity as a pillar of culture
Simplicity is one of the pillars on which Clojure is built. Clojure tries to solve many problems in software development as simply as possible. Instead of building complex interfaces, objects or factories, it uses immutability and simple data structures
Pro Designed for concurrency
Since Clojure is designed for concurrency, it offers things like Software Transaction Memory, functional programming without side-effects and immutable data structures right out of the box. This means that the development team can focus their energies on developing features instead of concurrency details.
Pro Tries to solve problems as simply as possible
Simplicity is one of the pillars on which Clojure is built. Clojure tries to solve many problems in software development as simply as possible. Instead of building complex interfaces, objects or factories, it uses immutability and simple data structures.
Pro Good for writing concurrent programs
Since Clojure is designed for concurrency, it offers things like Software Transaction Memory, functional programming without side-effects and immutable data structures right out of the box. This means that the development team can focus their energies on developing features instead of concurrency details.
Pro Immutability is the default
Clojure programmers are highly encouraged to use immutable data in their code. Therefore, most data will be immutable by default.
State change is handled by functions (for transformations) and atoms (an abstraction that encapsulates the idea of some entity having an identity).
Cons
Con Syntax can be alien / jarring for those used to other Lisps
Perhaps some may consider this attribute an advantage, but I do not. Clojure does not attempt to maintain significant compatibility with other Lisps. So, if you already know a Lisp or are used to the way Lisp works in general, you'll probably be confused if you take a look at Clojure. See these resources for more details on this subject:
Con Lack of static typing makes maintenance of large projects unwieldy
Clojure is a great language but there's a sweet spot for the size of a project. If a project becomes too large whether that is from code size or size of team then you need very experienced and dedicated developers to ensure that your program's correctness is upheld. Which means an emphasis on testing to catch integration errors between function calls i.e. function is receiving the data in the expected format. Normally the static compiler would catch these sort of things but as it's dynamic you can only see potential issues at runtime. Having a comprehensive test suite and now Clojure.spec in 1.9 helps in this regard.
Con Lack of static typing makes maintenance of large projects unwieldy
Clojure is a great language but there's a sweet spot for the size of a project. If the project becomes too large whether that's from the code base or the size of the team, then you need very experienced and dedicated developers to ensure your program's correctness is upheld. This means there must be an emphasis on testing to catch integration errors between function calls i.e. ensuring the function is receiving data in the expected format.
Normally a static compiler would catch these sort of things but as Clojure is dynamic you only see potential issues at runtime. Having a comprehensive, well maintained test suite and now with the addition of Clojure Spec in 1.9 helps in this regard.
Recommendations
Comments
Flagged Pros + Cons
Pro Awesome community
The community in Slack is very welcoming to beginners and experienced programmers alike.