;;;; Snippet #1 (defprotocol ZeichenZaehler "Zaehle verschiedene Zeichen" (zaehle-leerzeichen [this] "Zaehle Leerzeichen") (zaehle-ziffern [this] "Zaehle Ziffern 0-9")) ;;;; ;;;; Snippet #2 (defn zaehle-ziffern-in-string [s] (count (filter (set "0123456789") s))) (extend-type java.lang.String ZeichenZaehler (zaehle-ziffern [s] (zaehle-ziffern-in-string s)) (zaehle-leerzeichen [s] (count (filter #(= % \space) s)))) user> (zaehle-ziffern "C3P0") 2 user> (zaehle-leerzeichen "Landkreis Leer") 1 ;;;; ;;;; Snippet #3 user> (deftype Planet [name position]) user.Planet user> (def venus (Planet. "Venus" 2)) #'user/venus user> (.name venus) "Venus" user> (.position venus) 2 ;;;; ;;;; Snippet #4 user> (defprotocol Entfernung (sonnen-entfernung [this])) user> (extend-type Planet Entfernung (sonnen-entfernung [this] (condp = (.name this) "Venus" "108e6 km"))) nil user> (sonnen-entfernung venus) "108e6 km" ;;;; ;;;; Snippet #5 (defprotocol FormatiereAdresse (fmt-email [this]) (fmt-anschrift [this])) (deftype LoginUser [vname nname alter strasse plz stadt] FormatiereAdresse (fmt-email [this] (str "<" (.vname this) " " (.nname this) ">" " " (.vname this) "." (.nname this) "@" "clojure-buch.de")) (fmt-anschrift [this] (str (.vname this) " " (.nname this) "\n" (.strasse this) "\n" (.plz this) " " (.stadt this) "\n")) java.lang.Comparable (compareTo [this other] (compare (.alter this) (.alter other)))) ;;;; ;;;; Snippet #6 user> (def emil (LoginUser. "Emil" "Egal" 21 "Einsteinstr. 1" 111 "Eselei")) #'user/emil user> (fmt-email emil) " Emil.Egal@clojure-buch.de" user> (fmt-anschrift emil) "Emil Egal\nEinsteinstr. 1\n111 Eselei\n" user> (def anja (LoginUser. "Anja" "Auchegal" 28 "An der Ampel" 8 "Achso")) #'user/anja user> (compare anja emil) 1 user> (fmt-email anja) " Anja.Auchegal@clojure-buch.de" ;;;; ;;;; Snippet #7 (defprotocol TypischerSatz (sag-deinen-satz [this])) (defrecord BuchCharakter [name typ-satz autor] TypischerSatz (sag-deinen-satz [this] (println (:typ-satz this)))) ;;;; ;;;; Snippet #8 user> (def generalticktack (BuchCharakter. "General Ticktack" (str "Mein Name [tic] ist General Ticktack\n" "Und dies sind [tac] meine Kupfernen Kerle") "Moers")) #'user/generalticktack user> (def gaunab (BuchCharakter. "Gaunab der 99." "Ich lefehbe dir, mir zu chenhorge" "Moers")) #'user/gaunab user> (:autor gaunab) "Moers" user> (generalticktack :name) java.lang.ClassCastException: user.BuchCharakter cannot be cast to clojure.lang.IFn ;;;; ;;;; Snippet #9 user> (sag-deinen-satz gaunab) Ich lefehbe dir, mir zu chenhorge nil user> (sag-deinen-satz generalticktack) Mein Name [tic] ist General Ticktack Und dies sind [tac] meine Kupfernen Kerle ;;;; ;;;; Snippet #10 user> (assoc gaunab :name "Gaunab der Letzte") #:user.BuchCharakter{:name "Gaunab der Letzte", :typ-satz "Ich lefehbe dir, mir zu chenhorge", :autor "Moers"} ;;;; ;;;; Snippet #11 user> (defn print-name [{n :name}] (println "Name: " n)) #'user/print-name user> (print-name gaunab) Name: Gaunab der 99. nil ;;;; ;;;; Snippet #12 (def Walker (reify Runnable (run [this] (println "I'm walking.")))) user> (.run Walker) I'm walking. nil user> (.start (Thread. Walker)) nil I'm walking. ;;;;