I've been doing Clojure full time for a few years. Here a recommendation on editor setup if you're new to the parentheses:
1. Setup Cursive ( https://cursive-ide.com/ )
2. Start a REPL on the command line with `lein repl :start :port 38123` and connect to that repl with cursive, a remote REPL.
3. Bind and learn the following structural editing commands:
a) Grow selection (this will be by FAR the most used in the beginning)
b) Slurp.
c) Send top form to REPL.
d) Join lines
Don't ever select by line, only use "grow selection". Don't ever break any parens ("[({") imbalance. Shouldn't happend if you use "grow selection".
Editing like this will get you pretty darn productive. I used it for probably 6-7 months before I introduced more structural editing commands (Next in line is IMO "Move Forward").
Continuing with the topic of editor setups - I highly recommend CIDER if you are already comfortable with Emacs. I say already comfortable because it is a bad idea to learn both Clojure and Emacs at the same time, especially so if you have no experience with Lisps.
CIDER is extremely powerful and has a built in step-through debugger which is a complete joy to use. It also uses nREPL under the hood and Emacs being built for Lisps, the support for sexp editing is first class - use the Smartparens package and as the parent comment said - use slurp forward, backword, raise, kill form etc. Think of it as editing an AST instead of text.
But CIDER is worth it just for the debugging experience.
the biggest leap in productivity i've experienced is after i tried parinfer (https://shaunlebron.github.io/parinfer/). seriously, just find the plugin for your editor, it is amazing, the cognitive load of balancing is simply gone.
Coded Clojure for years, including w/ Paredit and I find Parinfer extremely frustrating as it fights my edits and sometimes creates syntax errors - in the Atom Parinfer in indent mode anyway. Maybe other implementations are better? Or do I just have to "unlearn" a bunch before I can relax and let the magic flow? Cuz as it is, Parinfer makes me nuts.
the only issue i've seen with parinfer is that i can get confused when you have multiple forms within single line, it can sometimes inadvertently slurp the rightmost forms and i have to go and insert closing parens manually. that doesn't happen often though, otherwise it's been very smooth for me. i imagine that when one is fluent with paredit and structural editing, parinfer can feel like a step back, but for newbies it is the first thing i will always recommend.
I believe failing to recommend parinfer to a newbie doesn't make sense in any case, as it binds a very common issue for newcomers (the parentheses management) with something that is very intuitive, indentation with meaning, which in my opinion is part of the huge success of python.
I used parinfer for a 1-2 months. Then I quit and switched back. Wayyyy too many silent errors that get introduced and you don't notice them until runtime. Especially if you edit code that other people wrote.
I've also seen at least 4 people in the chats/forums that had errors because of parinfer. So no, I won't recommend it to a beginner.
Ok, that's a fair point. If you open code indented somewhere else, there might be changes.
In my experience, as my IDE (Intellij Idea) highlights lines that are changes for git, these errors are trivially detected. But perhaps for a newbie, this could be confusing? In any case I still think it is a net win.
Btw, this tutorial is by the author of the esteemed Jepsen https://jepsen.io/ and Riemann http://riemann.io/ . He really knows his stuff, yet this material is very approachable.
It should be noted however, that the project was put on hold several years ago, with the intent to eventually tackle:
Polymorphism, Modularization and refactoring, object state, JVM interop, Clojure type system, Compiler at runtime, Build your own language, Performance analysis, Parsers and protocols, Storage and persistence, Networks and messaging, and Concurrency and queues.
Consider http://www.braveclojure.com/ as another free and well-written Clojure learning resource, that's more complete.
I like Clojure but ended moving away from it to Racket instead. The error messages and debugging story in Clojure just plain suck, and have for a long time now.
Error output is just java stacktraces, which for a newcomer make zero sense. I got stuck for two days on something before realising the problem was because of a lazy list elsewhere in the program. The CIDER debugger is pretty good, but I can't help feel that people who sing it's praises haven't been exposed to graphical debuggers like in Visual Studio, which offer a far superior experience. Additionally there is no break on exception functionality, and you have to actually commit a debuggable version of a method before you can step through it. Combined with the nonsensical erro output, you can be looking for hours for the actual location an error occurs. Which is bizzare because functional languages usually make error finding a breeze because mutable state is so locked down.
I'll mention Cursive too, which is an intelliJ plugin, that does actually offer a really good editing experience, and more importantly a modern graphical debugger that makes sense. But it's only a 30 day trial before you need to pay, and because Clojures error messages are still useless I just can't see a reason to pay for something I get for free with any other language. It's a shame because otherwise the Clojure library comes across as really well designed.
Since moving to Racket, I've been a lot more productive because of the out of the box editor it ships with, which along with its built-in package manager, really make it feel like you can hit the road running.
Yes, stack traces suck, but being on the JVM is also a gigantic win for its runtime ecosystem and vast collection of solid libraries that you can access almost seamlessly. I.e. it's a flaw, but hardly a fatal one for large numbers of enthusiastic Clojurists.
It's not just being on the JVM that causes the annoying stack traces. It's certainly possible for Clojure to inspect errors and provide better ones. But then it needs to know a lot more about its hosting VM. The crappy stack trace situation was a design decision to keep Clojure loosely coupled to its VM, allowing it to be more easily ported to JS (ClojureScript), .NET (Clojure-CLR), etc.
For me its a huge advantage, massive ecosystem of existing libraries to fill any gaps in the clojure ecosystem and an extremely fast garbage collector + JIT.
Stack traces are annoying though, but fixing those is waayyyy easier than replicating the JVMs advantages.
Fast, bulletproof GC is beyond essential when using persistent data structures.
1. Setup Cursive ( https://cursive-ide.com/ ) 2. Start a REPL on the command line with `lein repl :start :port 38123` and connect to that repl with cursive, a remote REPL. 3. Bind and learn the following structural editing commands:
a) Grow selection (this will be by FAR the most used in the beginning)
b) Slurp.
c) Send top form to REPL.
d) Join lines
Don't ever select by line, only use "grow selection". Don't ever break any parens ("[({") imbalance. Shouldn't happend if you use "grow selection".
Editing like this will get you pretty darn productive. I used it for probably 6-7 months before I introduced more structural editing commands (Next in line is IMO "Move Forward").