;4.1 Datentypen ;Datentypen, die aus Java übernommen wurden ;Int 1 ;String "zwei" ;Boolean true false ;null nil ;Datentypen bekannt aus Common Lisp ;Symbol 'symbol ;Liste '(1 2 3) () '(+ b c) ;Ratio 1/2 ;bekannt aus Ruby ;Keywords :keyword :another_keyword ;Clojure-Datentypen ;Vektor: O(1) Zugriff auf Elemente über Index [1 2 3] [:noch 1 :anderer "vektor"] [:ein :vektor [", der einen vektor enthält"]] ;Map {:key :value, :num 42, :ratio 1/3, :string "hallo"} ;Set (ungeordnete Menge, effizienter Test auf enthalten-sein) #{1 2 3 4 5} ;Clojure: Sequenz-Interface Java: Collection-Interface (first [1 2 3]) (rest '(a b c)) ;Trick: O(1) anhängen an eine 1fach verkettete Liste (concat '(a b c) '(d e f) '(g h i)) ;4.2 STM mit Refs ;Refs und Transaktionen ;Erzeugen von Refs (def mycounter (ref 12)) ;dereferenzieren @mycounter ;dosync enthält eine Transaktion (dosync (alter mycounter inc)) ;alter verändert eine Ref ;Ein-/Ausgabe wirft Exception in Transaktion (dosync (io! (prn "hallo"))) (dotimes [threads 5] ;5-mal neuen Thread starten (.start (new Thread (fn [] (dotimes [i 10000] (dosync (commute mycounter inc))))))) ;mycounter wird 50000-mal erhöht ;4.3: Java-Interop ;Instanz erzeugen (new java.util.Date) ;Java-Methode aufrufen (.getHours (java.util.Date.)) (class :key) (doto (java.util.Date.) (prn) (.setHours 12)) ;destruktives Update (.. 12 (toString) (charAt 0)) ;12 ist ein Objekt