20

There are a lot of tools online that take a JSON text and show you formatted and well indented format of the same.

Some go even further and make a nice tree-like structure: http://jsonviewer.stack.hu/

Do we have something similar for Clojure code ?

Or something that can at least auto-indent it.

If the text that I have is this :

(defn prime? [n known](loop [cnt (dec (count known)) acc []](if (< cnt 0) (not (any? acc))
(recur (dec cnt) (concat acc [(zero? (mod n (nth known cnt)))])))))

It should auto-indent to something like this:

(defn prime? [n known]
  (loop [cnt (dec (count known)) acc []]
    (if (< cnt 0) (not (any? acc))
    (recur (dec cnt) (concat acc [(zero? (mod n (nth known cnt)))])))))
Amogh Talpallikar
  • 12,084
  • 13
  • 79
  • 135

4 Answers4

25

Have a look at https://github.com/xsc/rewrite-clj It is brand new and does exactly what you are asking for.

EDIT I am still getting upvotes for this. I believe I found a better solution: You can easily do this with clojure.pprint utilizing code-dispatch without using an external library.

(clojure.pprint/write '(defn prime? [n known](loop [cnt (dec (count known)) acc []](if (< cnt 0) (not (any? acc))                                                                                                 (recur (dec cnt) (concat acc [(zero? (mod n (nth known cnt)))]))))) 
  :dispatch clojure.pprint/code-dispatch)
=> 
(defn prime? [n known]
  (loop [cnt (dec (count known)) acc []]
    (if (< cnt 0)
      (not (any? acc))
      (recur
        (dec cnt)
        (concat acc [(zero? (mod n (nth known cnt)))])))))
Leon Grapenthin
  • 9,246
  • 24
  • 37
7

I'm not aware of any online services which do this, but there are Clojure libraries which serve this purpose. clojure.pprint comes with Clojure (the key function is clojure.pprint/pprint); Brandon Bloom's fipp is a significantly faster alternative.

Note that neither of these is particularly likely to format code as a programmer armed with Emacs would; they're close enough to be useful, however, and for literal data (not intended to be interpreted as code) may well match human standards.

Michał Marczyk
  • 83,634
  • 13
  • 201
  • 212
5

Following up on this - there is now http://pretty-print.net which will serve this very purpose for EDN and Clojure Code.

comamitc
  • 831
  • 1
  • 9
  • 14
  • broken though :( just prints "Uncaught Invalid match arg: /^#/" in the javascript console and renders nothing. – dsvensson Jan 16 '16 at 22:17
  • @dsvensson - sorry about that. That clojurescript version got a bit janky with the leiningen version running on the server. I've since moved this to it's own dedicated server and fixed that problem. – comamitc Jan 23 '16 at 05:56
  • The link is dead – Andrew Au Mar 27 '18 at 00:09
  • 1
    Luckily it still exists on Wayback https://web.archive.org/web/20170707155649/http://pretty-print.net:80/ – Squish Mar 28 '18 at 02:01
1

There is now https://github.com/weavejester/cljfmt for that purpose

Instructions

Add it in your Leiningen plugins:

:plugins [[lein-cljfmt "0.6.1"]]

Then, to autoformat all code in your project:

lein cljfmt fix

Sample

Your sample code will become:

(defn prime? [n known] (loop [cnt (dec (count known)) acc []] (if (< cnt 0) (not (any? acc))
                                                                  (recur (dec cnt) (concat acc [(zero? (mod n (nth known cnt)))])))))

After adding some linebreaks and reformatting again:

(defn prime? [n known]
  (loop [cnt (dec (count known)) acc []]
    (if (< cnt 0) (not (any? acc))
        (recur (dec cnt) (concat acc [(zero? (mod n (nth known cnt)))])))))
Yoan Tournade
  • 623
  • 10
  • 15