https://github.com/ztellman/sleight.git
git clone 'https://github.com/ztellman/sleight.git'
(ql:quickload :ztellman.sleight)
Sleight allows pervasive transforms to Clojure code, akin to wrapping all your code and the code in the libraries you depend on in the same macro.
Possible uses include:
Maybe!
Sleight can be used via the lein-sleight
plugin. To use in all projects, add [lein-sleight "0.2.2"]
to the :plugins
vector of your :user
profile in ~/.lein/profiles.clj
.
To use for a specific project, add [lein-sleight "0.2.2"]
to the :plugins
vector in project.clj
.
Once this is done, define a transform in your project or one of its dependencies.
(def reverse-vectors
{:pre (fn [] (println "Get ready for some confusion..."))
:transform (fn [x] (riddley.walk/walk-exprs vector? reverse x))
:post (fn [] (println "That probably didn't go very well"))})
A transform is defined as a map containing one or more of the keys :pre
, :transform
, and :post
. The :pre
callback is invoked before the reader is hijacked to perform the transformation, the :transform
function is passed each form as it's read it, and returns a modified form. The :post
callback is invoked as the process is closed.
To perform safe code transformations, use Riddley.
Then, in your project.clj
, add something like this:
(project your-project "1.0.0"
:sleight {:default {:transforms [a.namespace/reverse-vectors]}
:partial {:transforms [a.namespace/reverse-vectors]
:namespaces ["another.namespace*"]}})
The :transforms
key maps onto a list of transforms, which are applied left to right. The :namespaces
key maps onto a list of namespace filters, which confines the transformation to namespaces which match one of the filters.
lein sleight
is not a standalone task, it's meant to modify other tasks. For instance, if we want to apply our transform to code while testing, we'd run:
lein sleight test
Since we haven't given a selector before the test
task, the :default
transform is selected. To specify the :partial
transform, we'd run:
lein sleight :partial test
Copyright (C) 2013 Zachary Tellman
Distributed under the MIT License