Into Clojure
Upcoming SlideShare
Loading in...5
×
 

Into Clojure

on

  • 751 views

 

Statistics

Views

Total Views
751
Views on SlideShare
751
Embed Views
0

Actions

Likes
1
Downloads
5
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • * Sponsing\n* Andre møte\n
  • \n
  • Først lisp i 1958 John McCarthy\nIkke objektorientert\nYtelse nesten som Java\n
  • \n
  • \n
  • \n
  • \n
  • #### Nå har dere sett all syntaksen ####\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • #### Skog av funksjoner som kan operere på disse datastrukturene ####\nLa oss se på noen som er litt spesielle.\n
  • #### Skog av funksjoner som kan operere på disse datastrukturene ####\nLa oss se på noen som er litt spesielle.\n
  • #### Skog av funksjoner som kan operere på disse datastrukturene ####\nLa oss se på noen som er litt spesielle.\n
  • #### Skog av funksjoner som kan operere på disse datastrukturene ####\nLa oss se på noen som er litt spesielle.\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Into Clojure Into Clojure Presentation Transcript

  • 11.10.2011
  • Agenda• Intro til Clojure - Alf Kristian Støyle• Inkrementell utvikling med Clojure, Emacs og SLIME - Stig Henriksen• Clojure STM - Ole Christian Rynning• Eratosthenes sil: et eventyr om optimalisering - Bodil Stokke
  • Clojure• General purpose• Lisp (List Processing)• Funksjonelt• Kompilert• Dynamisk typet
  • Literaler"String" ;=> String
  • Literaler "String"(class "String") ;=> java.lang.String String
  • Literaler(class "String" "String") ;=> String java.lang.String(class #"regex") ;=> java.util.regex.Pattern(class 123) ;=> java.lang.Integer(class 2147483648) ;=> java.lang.Long(class 123M) ;=> java.math.BigDecimal(class 123N) ;=> clojure.lang.BigInt(class true) ;=> java.lang.Boolean(class false) ;=> java.lang.Boolean(class 42/43) ;=> clojure.lang.Ratio(class c) ;=> java.lang.Character(class foo) ;=> clojure.lang.Symbol(class :bar) ;=> clojure.lang.Keyword(class nil) ;=> nil
  • Collection literaler; List(3 2 1); Vector[1 2 3]; Set#{1 2 3}; Map{1 "one", 2 "two"‚ 3 "three"}
  • Collection literaler; List(3 2 1) -> (list 3 2 1); Vector[1 2 3] -> (vector 1 2 3); Set#{1 2 3} -> (hash-set 1 2 3); Map{1 "one", 2 "two"‚ 3 "three"} -> (hash-map 1 "one", 2 "two", 3 "three")
  • Dette er en liste(+ 1 2)
  • Dette er en liste(+ 1 2) ;=> (+ 1 2)
  • Dette er en form(+ 1 2)
  • Dette er en form(+ 1 2);=> 3
  • Dette er en form(+ 1 2);=> 3
  • Dette er en form(+ 1 2);=> 3
  • Dette er en form(+ 1 2);=> 3
  • Prefiks notasjon(+ 1 2);=> 3
  • Dette er en form(apply + (1 2)) ;=> 3
  • Dette er en form(apply + (1 2)) ;=> 3
  • Dette er en form(apply + (1 2)) ;=> 3
  • Dette er en java.lang.String "(+ 1 2)" ;=> "(+ 1 2)"
  • Dette er en java.lang.Stringsom kan konverteres til en form(read-string "(+ 1 2)") ;=> (+ 1 2)
  • Dette er en java.lang.String som kan konverteres til en form som kan evalueres(eval (read-string "(+ 1 2)")) ;=> 3
  • Read-compile-evaluate1. Tekst konverteres til forms2. Forms blir konvertert til bytekode av compiler3. Bytekode evalueres
  • Funksjoner(fn [n] (* 2 n))
  • Funksjoner (fn [n] (* 2 n));=> #<core$eval376$fn__377 user$eval376$fn__377@5c76458f>
  • Funksjoner((fn [n] (* 2 n)) 4)
  • Funksjoner((fn [n] (* 2 n)) 4) ;=> 8
  • Funksjoner(fn [n] (* 2 n))#(* 2 %)
  • Funksjoner(fn [n] (* 2 n))#(* 2 %)#(* 2 %1)
  • Funksjoner & Vars(def times-two (fn [n] (* 2 n)));=> #user/times-two
  • Funksjoner & Vars(def times-two (fn [n] (* 2 n)));=> #user/times-two(times-two 4);=> 8
  • Funksjoner & Vars(def times-two (fn [n] (* 2 n)))(defn times-two [n] (* 2 n))
  • Immutable og persistente datastrukturer(def my-list (3 2 1)); => (3 2 1)
  • Immutable og persistente datastrukturer(def my-list (3 2 1)); => (3 2 1)
  • Immutable og persistente datastrukturer(def my-list (3 2 1)); => (3 2 1)(def my-other-list (cons 4 my-list)); => (4 3 2 1)
  • Immutable og persistente datastrukturer(def my-list (3 2 1)); => (3 2 1)(def my-other-list (cons 4 my-list)); => (4 3 2 1)
  • Immutable collections; List(3 2 1); Vector[1 2 3]; Set#{1 2 3}; Map{1 "one", 2 "two"‚ 3 "three"}
  • first(first (1 2 3))(first [1 2 3])(first #{1 2 3})(first {:one "one" :two "two"})
  • first(first (1 2 3));=> 1(first [1 2 3]);=> 1(first #{1 2 3});=> 1(first {:one "one" :two "two"})
  • first(first (1 2 3));=> 1(first [1 2 3]);=> 1(first #{1 2 3});=> 1(first {:one "one" :two "two"});=> [:one "one"]
  • rest(rest (1 2 3))(rest [1 2 3])(rest #{1 2 3})(rest {:one "one" :two "two"})
  • rest(rest (1 2 3));=> (2 3)(rest [1 2 3]);=> (2 3)(rest #{1 2 3});=> (2 3)(rest {:one "one" :two "two"})
  • rest(rest (1 2 3));=> (2 3)(rest [1 2 3]);=> (2 3)(rest #{1 2 3});=> (2 3)(rest {:one "one" :two "two"});=> ([:two "two"])
  • rest(rest ())(rest [])(rest #{})(rest {})
  • rest(rest ());=> ()(rest []);=> ()(rest #{});=> ()(rest {});=> ()
  • get(get (1 2 3) 0)(get [1 2 3] 0)(get #{3 2 1} 1)(get {:one 1 :two 2 :three 3} :one)
  • get(get (1 2 3) 0)(get [1 2 3] 0);=> 1(get #{3 2 1} 1)(get {:one 1 :two 2 :three 3} :one)
  • get(get (1 2 3) 0)(get [1 2 3] 0);=> 1(get #{3 2 1} 1);=> 1(get {:one 1 :two 2 :three 3} :one)
  • get(get (1 2 3) 0)(get [1 2 3] 0);=> 1(get #{3 2 1} 1);=> 1(get {:one 1 :two 2 :three 3} :one);=> 1
  • get(get (1 2 3) 0);=> nil(get [1 2 3] 0);=> 1(get #{3 2 1} 1);=> 1(get {:one 1 :two 2 :three 3} :one);=> 1
  • get(get (1 2 3) 0 "yay");=> yay(get [1 2 3] -1 "yay");=> yay(get #{3 2 1} 0 "yay");=> yay(get {:one 1 :two 2 :three 3} :zero "yay");=> yay
  • collections er((1 2 3) 0) funksjoner([1 2 3] 0)(#{3 2 1} 1)({:one 1 :two 2 :three 3} :one)
  • collections er((1 2 3) 0) funksjoner([1 2 3] 0);=> 1(#{3 2 1} 1);=> 1({:one 1 :two 2 :three 3} :one);=> 1
  • noen collections er funksjoner((1 2 3) 0);=> java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to clojure.lang.IFn([1 2 3] 0);=> 1(#{3 2 1} 1);=> 1({:one 1 :two 2 :three 3} :one);=> 1
  • contains?(contains? (10 11 12) 10)(contains? [10 11 12] 1)(contains? #{3 2 1} 1)(contains? {:one 1 :two 2 :three 3} :one)
  • contains?(contains? (10 11 12) 10)(contains? [10 11 12] 1)(contains? #{3 2 1} 1);=> true(contains? {:one 1 :two 2 :three 3} :one)
  • contains?(contains? (10 11 12) 10)(contains? [10 11 12] 1)(contains? #{3 2 1} 1);=> true(contains? {:one 1 :two 2 :three 3} :one);=> true
  • contains?(contains? (10 11 12) 10);=> false(contains? [10 11 12] 1)(contains? #{3 2 1} 1);=> true(contains? {:one 1 :two 2 :three 3} :one);=> true
  • contains?(contains? (10 11 12) 10);=> false(contains? [10 11 12] 1);=> true(contains? #{3 2 1} 1);=> true(contains? {:one 1 :two 2 :three 3} :one);=> true
  • .contains(.contains (10 11 12) 10)(.contains [10 11 12] 1)(.contains #{3 2 1} 1)(.contains {:one 1 :two 2 :three 3} :one)
  • .contains(.contains (10 11 12) 10);=> true(.contains [10 11 12] 1);=> false(.contains #{3 2 1} 1);=> true(.contains {:one 1 :two 2 :three 3} :one)
  • .contains(.contains (10 11 12) 10);=> true(.contains [10 11 12] 1);=> false(.contains #{3 2 1} 1);=> true(.contains {:one 1 :two 2 :three 3} :one);=> java.lang.IllegalArgumentException: No matching methodfound: contains for class clojure.lang.PersistentArrayMap
  • .contains(.contains (10 11 12) 10);=> true(.contains [10 11 12] 1);=> false(.contains #{3 2 1} 1);=> true(.containsKey {:one 1 :two 2 :three 3} :one);=> true
  • Java interop(new java.util.ArrayList);=> #<ArrayList []>
  • Java interop(new java.util.ArrayList);=> #<ArrayList []>(java.util.ArrayList.);=> #<ArrayList []>
  • Java interop(System/currentTimeMillis);=> 1318164613423(.size (new java.util.ArrayList));=> 0(. (new java.util.ArrayList) size);=> 0
  • Makroer(infix (1 + 2));=> 3
  • Makroer(infix (1 + 2));=> 3(defmacro infix [form] (list (second form) (first form) (first (nnext form))));=> #user/infix
  • Read-compile-evaluate1. Tekst konverteres til forms2. Forms blir konvertert til bytekode av compiler3. Dersom compiler finner en makro, ekspander makro og begynn på 1.4. Bytekode evalueres
  • Makroer(infix (1 + 2));=> 3(defmacro infix [form] (list (second form) (first form) (first (nnext form))));=> #user/infix
  • Makroer(infix (1 + 2));=> 3(defmacro infix [form] (list (second form) (first form) (first (nnext form))));=> #user/infix(macroexpand (infix (1 + 2)));=> (+ 1 2)
  • Makroer(defmacro infix [form] (list (second form) (first form) (first (nnext form))));=> #user/infix(defmacro infix [form] `(~(second form) ~(first form) ~@(nnext form)));=> #user/infix
  • Makroer• The two rules of the macro club Programming Clojure - Stuart Halloway 2009
  • Makroer• The two rules of the macro club 1. Don’t write macros. Programming Clojure - Stuart Halloway 2009
  • Makroer• The two rules of the macro club 1. Don’t write macros. 2. Only write macros if that is the only way to encapsulate a pattern. Programming Clojure - Stuart Halloway 2009
  • Makroer• The two rules of the macro club 1. Don’t write macros. 2. Only write macros if that is the only way to encapsulate a pattern. 3. You can write any macro that makes life easier for your callers when compared with an equivalent function. Programming Clojure - Stuart Halloway 2009
  • REPL demo“late collections/funksjoner”