parseclj
is an Emacs Lisp library for parsing Clojure code and EDN data. It supports several input and output formats, all powered by the same shift-reduce parser function.
Take a look at the design document for more details.
parseclj
is in alpha state right now, its API might be subject to change.
Available on the major package.el
community maintained repos - MELPA Stable and MELPA repos.
MELPA Stable is the recommended repo as it has the latest stable version. MELPA has a development snapshot for users who don't mind (infrequent) breakage but don't want to run from a git checkout.
You can install parseclj
using the following command:
M-x package-install [RET] parseclj [RET]
or if you'd rather keep it in your dotfiles:
(unless (package-installed-p 'parseclj) (package-install 'parseclj))
If the installation doesn't work try refreshing the package list:
M-x package-refresh-contents
parseclj
contains function that return an AST that, for example, given as input (1 2 [:a :b :c])
, it looks like this:
((:node-type . :root) (:position . 1) (:children ((:node-type . :list) (:position . 1) (:children ((:node-type . :number) (:position . 2) (:form . "1") (:value . 1)) ((:node-type . :number) (:position . 4) (:form . "2") (:value . 2)) ((:node-type . :vector) (:position . 6) (:children ((:node-type . :keyword) (:position . 7) (:form . ":a") (:value . :a)) ((:node-type . :keyword) (:position . 10) (:form . ":b") (:value . :b)) ((:node-type . :keyword) (:position . 13) (:form . ":c") (:value . :c))))))))
In order to use any of these functions, you first need to require it:
(require 'parseclj)
And then you will have the following functions at your disposal:
-
parseclj-parse-clojure
&rest string-and-optionsWhen no arguments, parses Clojure source code into an AST and returns it. When given a string as a first argument, parses it and returns the corresponding AST.
A list of options can be passed down to the parsing process, particularly:
:lexical-preservation
: a boolean value to retain whitespace, comments, and discards. Defaults to nil.:fail-fast
: a boolean value to raise an error when encountering invalid syntax. Defaults to t.
Examples:
(parseclj-parse-clojure) ;; will parse clojure code in the current buffer and return an AST (parseclj-parse-clojure "(1 2 3)") ;; => ((:node-type . :root) ... ) (parseclj-parse-clojure :lexical-preservation t) ;; will parse clojure code in current buffer preserving whitespaces, comments and discards
Note: there's an open issue to extend this API to parse clojure code within some boundaries of a buffer. Pull requests are welcome.
-
parseclj-unparse-clojure
astTransform the given AST into Clojure source code and inserts it into the current buffer.
-
parseclj-unparse-clojure-to-string
astTransfrom the given AST into Clojure source code and returns it as a string.
© 2017-2018 Arne Brasseur
Distributed under the terms of the GNU General Public License 3.0 or later. See LICENSE.