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:
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
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
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
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 :)