diff --git a/koans/about_runtime_polymorphism.clj b/koans/about_runtime_polymorphism.clj new file mode 100644 index 0000000..a8171ee --- /dev/null +++ b/koans/about_runtime_polymorphism.clj @@ -0,0 +1,35 @@ +(defn hello + ([] "Hello World!") + ([a] (str "Hello, you silly " a ".")) + ([a & more] (str "Hello to this group: " + (apply str + (interpose ", " (concat (list a) more))) + "!"))) + +(defmulti diet (fn [x] (:eater x))) +(defmethod diet :herbivore [a] __) +(defmethod diet :carnivore [a] __) +(defmethod diet :default [a] __) + +(meditations + "Some functions can be used in different ways - with no arguments" + (= __ (hello)) + + "With one argument" + (= __ (hello "world")) + + "Or with many arguments" + (= __ + (hello "Peter" "Paul" "Mary")) + + "Multimethods allow more complex dispatching" + (= "Bambi eats veggies." + (diet {:species "deer" :name "Bambi" :age 1 :eater :herbivore})) + + "Different methods are used depending on the dispatch function result" + (= "Simba eats animals." + (diet {:species "lion" :name "Simba" :age 1 :eater :carnivore})) + + "You may use a default method when no others match" + (= "I don't know what Rich Hickey eats." + (diet {:name "Rich Hickey"}))) diff --git a/koans/path_to_enlightenment.clj b/koans/path_to_enlightenment.clj index ee2d974..450ef35 100644 --- a/koans/path_to_enlightenment.clj +++ b/koans/path_to_enlightenment.clj @@ -19,4 +19,5 @@ (load "about_functions") (load "about_conditionals") (load "about_higher_order_functions") +(load "about_runtime_polymorphism") (println "You have acheived clojure enlightenment. Namaste.")