Command line arguments with Clojure
I am new to Clojure land and I am working on a command line tool using it. I found tools.cli library for processing command line arguments. From the documentation it looked that it has lot of features but I got overwhelmed by it. I wanted something simpler. For me, simpler meant that I would be able to get more comfortable with Clojure Syntax. My requirements were straightforward, first argument would be the name of the task and rest of the arguments would be associated to that task.
While searching clojuredocs showed: *command-line-args*
A sequence of the supplied command line arguments, or nil if none were supplied
It looked good. Syntax was easy. I could do (first *command-line-args*)
to get the first argument, (second ..)
, would give me second, so on and so forth. I tested it with lein run arg1 arg2
and it worked as expected. Fine, done.
Later, I created a standalone jar
of the tool. Strangely with jar
(using lein uberjar
) as I passed arguments to java -jar cli-tool.jar arg1 arg2
my command line arguments didn't get identified. Seems *command-line-args*
didn't work with java
(?). I checked that main
function takes & args
as argument and it was a sequence
. From the book CLOJURE for the BRAVE and TRUE
The term sequence here refers to a collection of elements organized in linear order
And
Lists, vectors, sets, and maps all implement the sequence abstraction.
So ideally I should be able to do (first args)
and that should also work like it did for *command-line-args*
. I quickly tried that, I replaced all *command-line-args*
with args
. lein run
worked as expected and when I created a standalone jar
even that was able to process my command line arguments. Cheers for the abstraction :)