问题
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)))])))))
回答1:
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)))])))))
回答2:
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.
回答3:
Following up on this - there is now http://pretty-print.net which will serve this very purpose for EDN and Clojure Code.
回答4:
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)))])))))
来源:https://stackoverflow.com/questions/17829584/is-there-an-online-tool-to-auto-indent-and-format-clojure-code-like-there-are-ma