clojure-web-applikationen fuer beginner · clojure > lisp-variante auf jvm > funktionale...
TRANSCRIPT
![Page 1: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/1.jpg)
Clojure-Web-Applikationen für Beginner
BOB 2016
![Page 3: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/3.jpg)
27.04.10 14:17http://upload.wikimedia.org/wikipedia/en/1/1a/Clojure-glyph.svg
Page 1 of 1
![Page 4: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/4.jpg)
Clojure
> Lisp-Variante auf JVM
> Funktionale Sprache
> Dynamisch typisiert
> komplettes mächtiges Macrosystem
![Page 5: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/5.jpg)
Datenstrukturen
“Hello World"
3 3.14 3/2
\a
:firstfoo
#“Ch.*se”
(“Hello”, :first)
[3 4 3]{ :name “Michael”,
:company “innoQ” } #{3 4 3}
![Page 6: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/6.jpg)
Syntax
“You’ve just seen it” - Rich Hickey
![Page 7: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/7.jpg)
Funktionen(+ 1 2) > 3
(:city {:name “innoQ” :city “Monheim”}) > “Monheim”
(map inc [1 2 3]) > (2 3 4)
![Page 8: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/8.jpg)
Funktionen
(fn [x y] (+ x y))
(def add (fn [x y] (+ x y)))
(defn add [x y] (+ x y))
![Page 9: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/9.jpg)
Links
> http://clojure.org
> blog.cognitect.com/blog/2016/1/28/state-of-clojure-2015-survey-results
> https://juxt.pro/radar.html
> http://www.clojure-toolbox.com
![Page 10: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/10.jpg)
Web-Applikationen
![Page 11: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/11.jpg)
Web-Applikation
AppRequest
Response
![Page 12: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/12.jpg)
Web-Applikation
App(Request) = Response
![Page 13: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/13.jpg)
Web-Applikation(defn greet-controller [request] {:status 200 :headers {“Content-Type” “text/plain”} :body “Hello, world!”})
![Page 15: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/15.jpg)
Ring
Request
ResponseRing App
![Page 16: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/16.jpg)
Ring: Handler(defn greet-controller [request] {:status 200 :headers {“Content-Type” “text/plain”} :body “Hello, world!”})
![Page 17: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/17.jpg)
Ring: Middleware(defn wrap-logging [handler] (fn [request] (print request) (let [response (handler request)] (print response) response)))
![Page 18: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/18.jpg)
Ring: Middleware
> https://github.com/ring-clojure/ring-defaults
> https://github.com/ring-clojure/ring-json
![Page 19: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/19.jpg)
Ring: Adapter
> Jetty
> Servlet
> http-kit
> Tomcat
> …
![Page 20: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/20.jpg)
Ring: Request{:uri “/greet” :query-string “name=Michael” :request-method :get :headers { … } …}
![Page 21: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/21.jpg)
Ring: Response{:status 200 :headers { … } :body “Hello, Michael!”}
![Page 22: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/22.jpg)
Ring
HTTP Request
HTTP Response
Adapter
Middlew
are 1
Middlew
are 2
Middlew
are n
Handler
Request
Response
![Page 24: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/24.jpg)
Compojure
Request
ResponseRing
Compojure
App
![Page 25: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/25.jpg)
Compojure: Handler(def handler (GET “/hello” [] “Hello, world!”))
(handler {:request-method :get, :uri “/hello”}) > {:body “Hello, world!”}
(handler {:request-method :post, :uri “/hello”}) > nil
![Page 26: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/26.jpg)
Exkurs: Macros
![Page 27: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/27.jpg)
Clojure: Macros
“(case 3 1 “one” 2 “two” “more”)”
ReaderText Data Structures
(case 3 1 “one” 2 “two” “more”)
![Page 28: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/28.jpg)
Clojure: Macros
EvaluatorData Structures
(case 3 1 “one” 2 “two” “more”)
Data Structures
(if (= 3 1) “one” (if (= 3 2) “two” “more”))
![Page 29: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/29.jpg)
Zurück zu Compojure…
![Page 30: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/30.jpg)
Compojure: Macro
(GET “/hello” [] “Hello, world!”)
(fn [req] (if (and (= (:uri req) “/hello”) (= (:request-method req) :get)) {:body “Hello, world!”}))
![Page 31: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/31.jpg)
Compojure: Path(GET “/hello/:name” [name] (str “Hello, ” name “!”))
![Page 32: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/32.jpg)
Compojure: Routes(def my-routes (routes (GET “/hello” [] “Hello!”) (GET “/bye” [] “Bye!”)))
(defroutes my-routes (GET “/hello” [] “Hello!”) (GET “/bye” [] “Bye!”))
![Page 33: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/33.jpg)
Compojure: Alternativen
> https://github.com/juxt/bidi
> http://clojure-liberator.github.io/liberator/
![Page 35: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/35.jpg)
Hiccup
Request
ResponseRing
Compojure
App
Hiccup
![Page 36: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/36.jpg)
Hiccup: Basics[:div {:id “foo”} [:span “bar”]]
<div id=“foo”> <span>bar</span> </div>
![Page 37: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/37.jpg)
Hiccup: Shortcuts[:div#foo [:span “bar”]]
<div id=“foo”> <span>bar</span> </div>
![Page 38: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/38.jpg)
Hiccup: Links(link-to “www.innoq.com” “innoQ”)
<a href=“www.innoq.com”> innoQ </a>
[:a {:href “www.innoq.com”} “innoQ”]
![Page 39: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/39.jpg)
Hiccup: Formulare(form-to [:post “/login”] (text-field “Username”) (password-field “Password”) (submit-button “Login”))
![Page 40: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/40.jpg)
Hiccup: Alternativen
> https://github.com/danlarkin/clabango
> https://github.com/plakat/clj-thymeleaf
> https://github.com/cgrand/enlive
> https://github.com/yogthos/Selmer
![Page 41: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/41.jpg)
Fazit
![Page 42: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/42.jpg)
Fazit
> Funktionale Sprache ideal für Web-App
> Verbreitung nimmt zu
> Libraries anstelle von Frameworks
> Community gesund und hilfsbereit
![Page 43: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/43.jpg)
Interessante Libraries
> https://github.com/technomancy/leiningen
> https://github.com/weavejester/environ
> https://github.com/clojurewerkz/route-one
> https://github.com/krisajenkins/yesql
> https://github.com/seancorfield/clj-time
![Page 44: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/44.jpg)
Frameworks
> https://github.com/weavejester/duct
> http://www.luminusweb.net
> https://github.com/otto-de/tesla-microservice
> https://github.com/metosin/compojure-api
![Page 45: Clojure-Web-Applikationen fuer Beginner · Clojure > Lisp-Variante auf JVM > Funktionale Sprache > Dynamisch typisiert > komplettes mächtiges Macrosystem](https://reader033.vdocuments.us/reader033/viewer/2022043010/5fa24ec5fefc1c3c5c30725c/html5/thumbnails/45.jpg)
Danke! Fragen?
Kommentare?
Michael Vitz | @michaelvitz
innoQ Deutschland GmbH
Krischerstr. 100 40789 Monheim am Rhein Germany Phone: +49 2173 3366-0
www.innoq.com
Ohlauer Straße 43 10999 Berlin Germany
Ludwigstraße 180 E D-63067 Offenbach Germany
Kreuzstr. 16 D-80331 München Germany
https://www.innoq.com/en/talks/2016/02/clojure-webapps/