Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ...

116
We'll take care of it. Personally. Clojure Web Development Philipp Schirmacher | innoQ Friday, April 5, 13

Transcript of Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ...

Page 1: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

We'll take care of it. Personally.

Clojure Web DevelopmentPhilipp Schirmacher | innoQ

Friday, April 5, 13

Page 2: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

27.04.10 14:17http://upload.wikimedia.org/wikipedia/en/1/1a/Clojure-glyph.svg

Page 1 of 1

Friday, April 5, 13

Page 3: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Clojure 27.04.10 14:17http://upload.wikimedia.org/wikipedia/en/1/1a/Clojure-glyph.svg

Page 1 of 1

A practical Lisp variant for the JVM Functional programming

Dynamic Typing Full-featured macro systemBi-directional Java interopImmutable data structures

Friday, April 5, 13

Page 4: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Friday, April 5, 13

Page 5: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Lisp??

Friday, April 5, 13

Page 6: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Friday, April 5, 13

Page 7: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Lots of irritating silly parentheses

Friday, April 5, 13

Page 8: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Clojure Environment

Clojuresque (Gradle)

Leiningen

Friday, April 5, 13

Page 9: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbHhttp://www.tbray.org/ongoing/When/200x/2008/09/25/-big/R0010774.jpg.html

Rich Hickey

Friday, April 5, 13

Page 10: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Clojure Crash Course

Friday, April 5, 13

Page 11: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Generic Data Types

Friday, April 5, 13

Page 12: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

{:name "Clojure" :features [:functional :jvm :parens] :creator "Rich Hickey" :stable-version {:number "1.5.1"                  :release "2013/03/10"}}

Friday, April 5, 13

Page 13: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Functions

Friday, April 5, 13

Page 14: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(+ 1 2)> 3

Friday, April 5, 13

Page 15: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(:city {:name "innoQ"        :city "Monheim"})

> "Monheim"

(+ 1 2)> 3

Friday, April 5, 13

Page 16: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(:city {:name "innoQ"        :city "Monheim"})

> "Monheim"

(map inc [1 2 3])

> (2 3 4)

(+ 1 2)> 3

Friday, April 5, 13

Page 17: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(fn [x y] (+ x y))

Friday, April 5, 13

Page 18: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(fn [x y] (+ x y))

((fn [x y] (+ x y)) 1 2)

> 3

Friday, April 5, 13

Page 19: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(fn [x y] (+ x y))

((fn [x y] (+ x y)) 1 2)

> 3

(def add (fn [x y] (+ x y)))

Friday, April 5, 13

Page 20: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(fn [x y] (+ x y))

((fn [x y] (+ x y)) 1 2)

> 3

(def add (fn [x y] (+ x y)))

(defn add [x y] (+ x y)))

(add 1 2)

Friday, April 5, 13

Page 21: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn activity [weather]  (if (nice? weather)    :surfing    :playstation))

Friday, April 5, 13

Page 22: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn make-adder [x]  (fn [y]    (+ x y)))

Friday, April 5, 13

Page 23: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn make-adder [x]  (fn [y]    (+ x y)))

(def add-two (make-adder 2))

Friday, April 5, 13

Page 24: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn make-adder [x]  (fn [y]    (+ x y)))

(def add-two (make-adder 2))

(add-two 3)> 5

Friday, April 5, 13

Page 25: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Web Development?

Friday, April 5, 13

Page 26: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

app

request

response

Friday, April 5, 13

Page 27: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

app

request

response

data

Friday, April 5, 13

Page 28: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

app

request

response

data function

Friday, April 5, 13

Page 29: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Ring

Friday, April 5, 13

Page 30: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn hello-world-app [req]  {:status 200   :headers {"Content-Type" "text/plain"}   :body "Hello, World!"})

Friday, April 5, 13

Page 31: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn hello-world-app [req]  {:status 200   :headers {"Content-Type" "text/plain"}   :body "Hello, World!"})

(hello-world-app {:uri "/foo"                  :request-method :get})> {...}

Friday, April 5, 13

Page 32: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn hello-world-app [req]  {:status 200   :headers {"Content-Type" "text/plain"}   :body "Hello, World!"})

(hello-world-app {:uri "/foo"                  :request-method :get})> {...}

(run-jetty hello-world-app {:port 8080})

Friday, April 5, 13

Page 33: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn my-first-homepage [req]  {:status 200   :headers {"Content-Type" "text/html"}   :body (str "<html><head>"              "<link href=\"/pretty.css\" ...>"              "</head><body>"              "<h1>Welcome to my Homepage</h1>"              (java.util.Date.)              "</body></html>")})

Friday, April 5, 13

Page 34: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

stat

ic re

sour

ces

request

response

homepage

Friday, April 5, 13

Page 35: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn decorate [webapp]  (fn [req]    ...before webapp...    (webapp req)    ...after webapp...))

Friday, April 5, 13

Page 36: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn decorate [webapp]  (fn [req]    (if (static-resource? req)      (return-resource req)      (webapp req))))

Friday, April 5, 13

Page 37: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn wrap-resource [handler root-path]  (fn [request]    (if-not (= :get (:request-method request))      (handler request)      (let [path (extract-path request)]        (or (resource-response path {:root root-path})            (handler request))))))

Friday, April 5, 13

Page 38: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn my-first-homepage [req] ...)

Friday, April 5, 13

Page 39: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn my-first-homepage [req] ...)

(def webapp  (wrap-resource my-first-homepage "public"))

Friday, April 5, 13

Page 40: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn my-first-homepage [req] ...)

(def webapp  (wrap-resource my-first-homepage "public"))

(run-jetty webapp {:port 8080})

Friday, April 5, 13

Page 41: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(webapp {:uri "/pretty.css"         :request-method :get         :headers {}})> {:status 200   :headers {}   :body #<File ...resources/public/pretty.css>}

Friday, April 5, 13

Page 42: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

wra

p-re

sour

cerequest

response

my-!rst-homepagew

rap-!l

e-in

fo

Friday, April 5, 13

Page 43: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn homepage [req] ...)

Friday, April 5, 13

Page 44: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn homepage [req] ...)

(def webapp  (-> homepage      (wrap-resource "public")      wrap-file-info))

Friday, April 5, 13

Page 45: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn homepage [req] ...)

(def webapp  (-> homepage      (wrap-resource "public")      wrap-file-info))

(wrap-file-info (wrap-resource  homepage  "public"))

Friday, April 5, 13

Page 46: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn homepage [req] ...)

(def webapp  (-> homepage      (wrap-resource "public")      wrap-file-info))

(run-jetty webapp {:port 8080})

(wrap-file-info (wrap-resource  homepage  "public"))

Friday, April 5, 13

Page 47: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(webapp {:uri "/pretty.css"         :request-method :get         :headers {}})> {:status 200   :headers {"Content-Length" "16"             "Last-Modified" "Thu, 14 Jun ..."             "Content-Type" "text/css"}   :body #<File ...resources/public/pretty.css>}

Friday, April 5, 13

Page 48: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

wrap-resource

wrap-!le

wrap-params

wrap-session

wrap-flash

wrap-etag

wrap-basic-authentication

Friday, April 5, 13

Page 49: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

mid

dlew

arerequest

response

handlerm

iddl

ewar

e...

Friday, April 5, 13

Page 50: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

mid

dlew

arerequest

response

handlerm

iddl

ewar

e

rout

ing

...

Friday, April 5, 13

Page 51: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Compojure

Friday, April 5, 13

Page 52: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(def get-handler  (GET "/hello" []       "Hello, World!"))

Friday, April 5, 13

Page 53: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(def get-handler  (GET "/hello" []       "Hello, World!"))

(get-handler {:request-method :get              :uri "/hello"})> {:body "Hello, World!" ...}

Friday, April 5, 13

Page 54: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(def get-handler  (GET "/hello" []       "Hello, World!"))

(get-handler {:request-method :get              :uri "/hello"})> {:body "Hello, World!" ...}

(get-handler {:request-method :post              :uri "/hello"})> nil

Friday, April 5, 13

Page 55: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(def get-handler  (GET "/hello/:name" [name]       (str "Hello, " name "!")))

Friday, April 5, 13

Page 56: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(def get-handler  (GET "/hello/:name" [name]       (str "Hello, " name "!")))

(def post-handler  (POST "/names" [name]        (remember name)        (redirect (str "/hello/" name))))

Friday, April 5, 13

Page 57: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Digression: Macros

Friday, April 5, 13

Page 58: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

textCompiler

bytecode

Friday, April 5, 13

Page 59: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

text

Friday, April 5, 13

Page 60: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

textReader

Friday, April 5, 13

Page 61: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

textReader

datastructures

Friday, April 5, 13

Page 62: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

textReader Evaluator

datastructures

Friday, April 5, 13

Page 63: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

textReader Evaluator

datastructures

bytecode

Friday, April 5, 13

Page 64: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

textReader Evaluator

datastructures

bytecode

“(if true  (print "true"  (print "false"))”

Friday, April 5, 13

Page 65: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

textReader Evaluator

datastructures

bytecode

(if true  (print "true"  (print "false"))

“(if true  (print "true"  (print "false"))”

Friday, April 5, 13

Page 66: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

textReader Evaluator

datastructures

bytecode

“(cond  (< 4 3) (print "wrong")  (> 4 3) (print "yep"))”

Friday, April 5, 13

Page 67: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

textReader Evaluator

datastructures

bytecode

(cond  (< 4 3) (print "wrong")  (> 4 3) (print "yep"))

“(cond  (< 4 3) (print "wrong")  (> 4 3) (print "yep"))”

Friday, April 5, 13

Page 68: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

textReader Evaluator

datastructures

bytecode

cond-Macro

(cond  (< 4 3) (pri...  (> 4 3) (pri...

“(cond  (< 4 3) (print "wrong")  (> 4 3) (print "yep"))”

Friday, April 5, 13

Page 69: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

textReader Evaluator

datastructures

bytecode

(if (< 4 3)  (print "wrong")  (if (> 4 3)    (print "yep")    nil))

cond-Macro

(cond  (< 4 3) (pri...  (> 4 3) (pri...

“(cond  (< 4 3) (print "wrong")  (> 4 3) (print "yep"))”

Friday, April 5, 13

Page 70: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defmacro my-cond [c1 e1 c2 e2]  (list 'if c1        e1        (list 'if c2              e2              nil)))

Friday, April 5, 13

Page 71: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defmacro my-cond [c1 e1 c2 e2]  (list 'if c1        e1        (list 'if c2              e2              nil)))

(my-cond false (println "won't see this") true (println "it works!"))it works!

Friday, April 5, 13

Page 72: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(my-cond false (println "won't see this") true (println "it works!"))it works!

(defmacro my-cond [c1 e1 c2 e2]  `(if ~c1     ~e1     (if ~c2       ~e2       nil)))

Friday, April 5, 13

Page 73: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

text Reader Evaluatordatastructures

bytecode

“(GET "/hello" []   "Hello, World!")”

Friday, April 5, 13

Page 74: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

text Reader Evaluatordatastructures

bytecode

(GET "/hello" []   "Hello, World!")

“(GET "/hello" []   "Hello, World!")”

Friday, April 5, 13

Page 75: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

text Reader Evaluatordatastructures

bytecode

(GET "/hello" []   "Hello, World!")

(fn [req]  (if (and (match (:uri req) "/hello")           (= (:request-method req) :get))    {:body "Hello, World!" …}    nil))

GET-Macro

“(GET "/hello" []   "Hello, World!")”

Friday, April 5, 13

Page 76: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Back to Compojure...

Friday, April 5, 13

Page 77: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(def get-handler  (GET "/hello/:name" [name]       (str "Hello, " name "!")))

(def post-handler  (POST "/names" [name]        (remember name)        (redirect (str "/hello/" name))))

Friday, April 5, 13

Page 78: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defroutes todo-app

Friday, April 5, 13

Page 79: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defroutes todo-app (GET "/todos" []     (render (load-all-todos)))

Friday, April 5, 13

Page 80: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defroutes todo-app (GET "/todos" []     (render (load-all-todos))) (GET "/todos/:id" [id]       (render (load-todo id)))

Friday, April 5, 13

Page 81: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defroutes todo-app (GET "/todos" []     (render (load-all-todos))) (GET "/todos/:id" [id]       (render (load-todo id))) (POST "/todos" {json-stream :body}        (create-todo (read-json (slurp json-stream)))        (redirect "/todos")))

Friday, April 5, 13

Page 82: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defroutes more-routes  (context "/todos/:id" [id]

Friday, April 5, 13

Page 83: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defroutes more-routes  (context "/todos/:id" [id] (DELETE "/" []            (delete-todo id)            (redirect "/todos"))

Friday, April 5, 13

Page 84: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defroutes more-routes  (context "/todos/:id" [id] (DELETE "/" []            (delete-todo id)            (redirect "/todos")) (PUT "/" {json-stream :body}         (update-todo (read-json (slurp json-stream)))         (redirect (str "/todos/" id)))))

Friday, April 5, 13

Page 85: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defroutes complete-app  todo-app  more-routes  (not-found "Oops."))

Friday, April 5, 13

Page 86: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defroutes complete-app  todo-app  more-routes  (not-found "Oops."))

(def secure-app  (wrap-basic-authentication complete-app allowed?))

Friday, April 5, 13

Page 87: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defroutes complete-app  todo-app  more-routes  (not-found "Oops."))

(def secure-app  (wrap-basic-authentication complete-app allowed?))

(run-jetty (api secure-app) {:port 8080})

Friday, April 5, 13

Page 88: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

mid

dlew

arerequest

response

handlerm

iddl

ewar

e...

Friday, April 5, 13

Page 89: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

mid

dlew

arerequest

response

handlerm

iddl

ewar

e

rout

ing

...

Friday, April 5, 13

Page 90: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

mid

dlew

arerequest

response

handlerm

iddl

ewar

e

rout

ing

...

JSO

N

Friday, April 5, 13

Page 91: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

mid

dlew

arerequest

response

handlerm

iddl

ewar

e

rout

ing

...

JSO

NHT

ML

Friday, April 5, 13

Page 92: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Hiccup

Friday, April 5, 13

Page 93: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

<element attribute="foo">  <nested>bar</nested></element>

Friday, April 5, 13

Page 94: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

<element attribute="foo">  <nested>bar</nested></element>

[:element]

Friday, April 5, 13

Page 95: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

<element attribute="foo">  <nested>bar</nested></element>

[:element {:attribute "foo"}]

Friday, April 5, 13

Page 96: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

<element attribute="foo">  <nested>bar</nested></element>

[:element {:attribute "foo"} [:nested]]

Friday, April 5, 13

Page 97: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

<element attribute="foo">  <nested>bar</nested></element>

[:element {:attribute "foo"} [:nested "bar"]]

Friday, April 5, 13

Page 98: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

<html>  <head><title>Foo</title></head>  <body><p>Bar</p></body></html>

Friday, April 5, 13

Page 99: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

<html>  <head><title>Foo</title></head>  <body><p>Bar</p></body></html>

(def hiccup-example  [:html   [:head [:title "Foo"]]   [:body [:p "Bar"]]])

Friday, April 5, 13

Page 100: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

<html>  <head><title>Foo</title></head>  <body><p>Bar</p></body></html>

(def hiccup-example  [:html   [:head [:title "Foo"]]   [:body [:p "Bar"]]])

(html hiccup-example)> "<html>...</html>"

Friday, April 5, 13

Page 101: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(def paul {:name "Paul" :age 45})

Friday, April 5, 13

Page 102: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(def paul {:name "Paul" :age 45})

(defn render-person [person]  [:dl   [:dt "Name"] [:dd (:name person)]   [:dt "Age"] [:dd (:age person)]])

Friday, April 5, 13

Page 103: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(def paul {:name "Paul" :age 45})

(defn render-person [person]  [:dl   [:dt "Name"] [:dd (:name person)]   [:dt "Age"] [:dd (:age person)]])

(html (render-person paul))> "<dl><dt>Name</dt><dd>Paul</dd>...</dl>"

Friday, April 5, 13

Page 104: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn render-person [person]  [:dl   [:dt "Name"] [:dd (:name person)]   [:dt "Age"] [:dd (:age person)]])

Friday, April 5, 13

Page 105: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(defn render-person [person]  [:dl   [:dt "Name"] [:dd (:name person)]   [:dt "Age"] [:dd (:age person)]])

(defn people-page [people]  [:html [:head [:title "All the people"]] [:body (map render-person people)]])

Friday, April 5, 13

Page 106: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(link-to "http://www.innoq.com" "click here")> [:a {:href "http://www.innoq.com"} "click here"]

Friday, April 5, 13

Page 107: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

(link-to "http://www.innoq.com" "click here")> [:a {:href "http://www.innoq.com"} "click here"]

(form-to [:post "/login"]         (text-field "Username")         (password-field "Password")         (submit-button "Login"))> [:form {:action "POST" ...} [:input ...] ...]

Friday, April 5, 13

Page 108: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

<div id="my-id" class="class1 class2">  foo</div>

Friday, April 5, 13

Page 109: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

<div id="my-id" class="class1 class2">  foo</div>

[:div#my-id.class1.class2 "foo"]

Friday, April 5, 13

Page 110: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

mid

dlew

arerequest

response

handlerm

iddl

ewar

e

rout

ing

...

JSO

NHT

ML

Friday, April 5, 13

Page 111: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

mid

dlew

are{}

{}

handlerm

iddl

ewar

e

rout

ing

...

JSO

NHT

ML

serv

let a

dapt

erjavax.servlet.http.HttpServletRequest

javax.servlet.http.HttpServletRespone

Friday, April 5, 13

Page 112: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Conclusion

Friday, April 5, 13

Page 113: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

:-)

‣ Simple basic concepts

‣ Easy to use

‣ Little code (also in libraries)

‣ Helpful community

‣ Mature eco system

Friday, April 5, 13

Page 114: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

Thank you!

We'll take care of it. Personally.

© 2012 innoQ Deutschland GmbH

Philipp [email protected]@pschirmacher

Friday, April 5, 13

Page 115: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Backup

Friday, April 5, 13

Page 116: Clojure Web Developmentbed-con.org/2013/files/slides/WebDevelopmentmitClojure.pdf© 2013 innoQ Deutschland GmbH 27.04.10 14:17 Page 1 of 1 A practical Lisp variant for the JVM ...

© 2013 innoQ Deutschland GmbH

Task Libraries

HTTP Basics Ring

Routing Compojure

Moustache

HTML Hiccup

Enlive

Persistence clojure.java.jdbc

Korma

Monger

Asynchronous Server Aleph

JavaScript ClojureScript

Friday, April 5, 13