+ All Categories

Clojure

Date post: 24-Jun-2015
Category:
Upload: yiguang-hu
View: 1,278 times
Download: 4 times
Share this document with a friend
Description:
Clojure is simple and mighty
Popular Tags:
23
Clojure Yiguang Hu [email protected] Twitter:yighu
Transcript
Page 1: Clojure

Clojure

Yiguang [email protected]

Twitter:yighu

Page 2: Clojure

Features

• Elegant, expressive code• Code is data• Easy, fast Java interoperability• A sequence library unifies all kinds of data• Functional programming encourages reusable,

correct code• Concurrency without manual lock mgmt

Page 3: Clojure

Functional Programming

• Pure functions• Persistent data structures• Laziness and Recursion• Referential Transparency

Page 4: Clojure

Forms

• Constants:5, “xyz”• Keywords:#age• Symbols: map,reduce• Data structure: […] {…} #{…}• Callables: (if…) (var …) (map …) (and …)

Page 5: Clojure

map

• Map literal form(def inventors {"Lisp" "McCarthy" "Clojure" "Hickey"}) (inventors "Lisp")"McCarthy"

• Map with keywords as key: (def inventors {:Lisp "McCarthy" :Clojure "Hickey"})(inventors :Lisp)"McCarthy“

• Keywords are also functions

Page 6: Clojure

Structs

• (defstruct name & keys)(defstruct book :title :author)(def b (struct book "Naria" "CS Lewis"))user=> b{:title "Naria", :author "CS Lewis"}(:title b)"Naria"

Page 7: Clojure

Struct-map

(def a (struct-map book :copyright 2008 :title "Narnia" :author "CS Lewis"))

a{:title "Narnia", :author "CS Lewis", :copyright

2008}(:copyright a)2008

Page 8: Clojure

Map destructuring

• (defn fullname [{fname :first-name lname :lastname}] (str lname “, ” fname))

• (defn fullname [{:keys [first-name last-name])] (str last-name “, ” first-name))

Page 9: Clojure

Define function

(defn add [a b] (+ a b))

(defn ne([x] false)([x y] (not (= x y))))

Page 10: Clojure

Squence libraryCreate Sequences

range,repeat, iterate, take,cycle…(range 1 5)(1 2 3 4)(repeat 5 1)(1 1 1 1 1)(take 5 (iterate inc 1))(1 2 3 4 5) (take 10 (cycle (range 3)))(0 1 2 0 1 2 0 1 2 0)

Page 11: Clojure

Squence libraryFiltering Sequences

(filter odd? (range 10))(1 3 5 7 9)

Page 12: Clojure

Squence libraryTransforming Sequences

Mapreducesortsort-by

Page 13: Clojure

map

(map f coll)

(def a (list 1 2 3))(defn addn [a] (+ a 5))(map addn a)(6 7 8)

Page 14: Clojure

Reduce

(reduce f coll) (reduce f val coll)

(defn mul [a b] (* a b))(reduce mul a)6

Page 15: Clojure

Map->Reduce

(map addn a)(6 7 8)(reduce mul (map addn a))336

In parallel: (reduce mull (pmap addn a))

Page 16: Clojure

Sort, Sort-by

(sort > (range 5))(4 3 2 1 0)(sort-by :grade > [{:grade 90} {:grade 80} {:grade

100}])({:grade 100} {:grade 90} {:grade 80})

Page 17: Clojure

Refs

(def current-track (ref "oclc, kilgour"))(deref current-track)(ref-set current-track "osu, jones tower")java.lang.IllegalStateException: No transaction

running (NO_SOURCE_FILE:0)(dosync (ref-set current-track "osu, jones

tower"))"osu, jones tower"

Page 18: Clojure

atoms

• user=> (def current-book (atom "clojure, Hickey"))

• #'user/current-book• user=> (deref current-book)• "clojure, Hickey"• user=> (reset! current-book "java") • "java"

Page 19: Clojure

agent

• user=> (def counter (agent 0))• #'user/counter• user=> counter• #<Agent@67e13e07: 0>• user=> (send counter inc)• #<Agent@67e13e07: 0>• user=> counter• #<Agent@67e13e07: 1>

Page 20: Clojure

Clojure in grails

• grails install-plugin clojure• New dir src/clj is created• Add file Addnumber.clj in src/clj

(ns grails)(def twenty 20)(defn add_numbers [a b] (+ a b))

Page 21: Clojure

Call Clojure from Serviceclass ClojService { boolean transactional = false def addNumbers(x, y) { clj.add_numbers(x, y) } def addTwenty(x) { clj.add_numbers(x, clj.twenty) }}

Page 22: Clojure

Call Service in Controllerimport grails.converters.XML;class PlayController { def index = { } def clojServicedef cljaddnumber={ render clojService.addNumbers(Integer.parseInt(params.a?:"5"),

Integer.parseInt(params.b?:"4")) } def cljadd20={ render clojService.addTwenty(Integer.parseInt(params.a?:"10")) }}

Page 23: Clojure

Reference

• http://www.clojure.org• Programming Clojure by Stuart Halloway


Recommended