Date post: | 24-Jun-2015 |
Category: |
Technology |
Upload: | yiguang-hu |
View: | 1,278 times |
Download: | 4 times |
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
Functional Programming
• Pure functions• Persistent data structures• Laziness and Recursion• Referential Transparency
Forms
• Constants:5, “xyz”• Keywords:#age• Symbols: map,reduce• Data structure: […] {…} #{…}• Callables: (if…) (var …) (map …) (and …)
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
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"
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
Map destructuring
• (defn fullname [{fname :first-name lname :lastname}] (str lname “, ” fname))
• (defn fullname [{:keys [first-name last-name])] (str last-name “, ” first-name))
Define function
(defn add [a b] (+ a b))
(defn ne([x] false)([x y] (not (= x y))))
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)
Squence libraryFiltering Sequences
(filter odd? (range 10))(1 3 5 7 9)
Squence libraryTransforming Sequences
Mapreducesortsort-by
map
(map f coll)
(def a (list 1 2 3))(defn addn [a] (+ a 5))(map addn a)(6 7 8)
Reduce
(reduce f coll) (reduce f val coll)
(defn mul [a b] (* a b))(reduce mul a)6
Map->Reduce
(map addn a)(6 7 8)(reduce mul (map addn a))336
In parallel: (reduce mull (pmap addn a))
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})
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"
atoms
• user=> (def current-book (atom "clojure, Hickey"))
• #'user/current-book• user=> (deref current-book)• "clojure, Hickey"• user=> (reset! current-book "java") • "java"
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>
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))
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) }}
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")) }}