Clojure App 101
If you are new to Clojure, this post will quickly get you started. You will create a basic Clojure application and learn how to use Leiningen, a tool which helps to manage various tasks for Clojure projects, like creating them, managing dependencies or executing the code.
Installing Leiningen is pretty straighforward. You have to download this script (be sure to get the 2.x version) and make it accessible in your
$PATH. Upon the first run Leiningen bootstraps itself using that script.
Let's start with a most basic way of creating a Clojure project with Leiningen
λ lein new baaz Generating a project called baaz based on the 'default' template. To see other templates (app, lein plugin, etc), try `lein help new`.
This is our project file structure:
. ├── README.md ├── doc │ └── intro.md ├── project.clj ├── src │ └── baaz │ └── core.clj └── test └── baaz └── core_test.clj
Let's take a look at
(ns baaz.core) (defn foo "I don't do a whole lot." [x] (println x "Hello, World!"))
There is only one function defined. You can launch an interactive Clojure shell (called REPL) using
lein repl command. Notice that an attempt to call that function will result in an error: Unable to resolve symbol: foo in this context. The reason for that is
foo being defined in a different namespace than the one being loaded when REPL starts.
In order to make this project run on the command line through Leiningen you must add to that file a special
(defn -main  (foo "Zaiste"))
Once added, you can run it as:
λ lein run -m baaz.core Zaiste Hello, World!
If you don't want to include
-m parameter for each run, you can specify it inside
project.clj using a
:main parameter as shown below:
(defproject baaz "0.1.0" :main baaz.core :dependencies [[org.clojure/clojure "1.4.0"]])
Launching REPL with
:main parameter defined will automatically switch to
baaz.core namespace, othwerwise default
user namespace will be used.
Now, you know what happens while creating a barebone application with Leiningen. You can speed up this process using one of predefined application templates (you can also create your own template).
For example, there is a template called
app which includes a
-main definition along with the necessary declaration inside
project.clj. You can run this this template as:
λ lein new app baaz
You have the basics now. Next step would be to read more about Leiningen and its features.