Add some simple examples for multimethods
This commit is contained in:
parent
9c115996f9
commit
eb73f39c9e
2 changed files with 49 additions and 0 deletions
|
|
@ -280,4 +280,9 @@
|
||||||
[2 4]
|
[2 4]
|
||||||
[2 4]
|
[2 4]
|
||||||
6]}]
|
6]}]
|
||||||
|
|
||||||
|
["27_multimethods" {"__" ["Hello, World!"
|
||||||
|
"Hello there"
|
||||||
|
1
|
||||||
|
6]}]
|
||||||
]
|
]
|
||||||
|
|
|
||||||
44
src/koans/27_multimethods.clj
Normal file
44
src/koans/27_multimethods.clj
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
(ns koans.27-multimethods
|
||||||
|
(:require [koan-engine.core :refer :all]))
|
||||||
|
|
||||||
|
(defmulti multimethod-without-args
|
||||||
|
(fn [keyword-arg] keyword-arg))
|
||||||
|
|
||||||
|
(defmethod multimethod-without-args :first [_]
|
||||||
|
(str "Hello, World!"))
|
||||||
|
|
||||||
|
(defmethod multimethod-without-args :second [_]
|
||||||
|
(str "Hello there"))
|
||||||
|
|
||||||
|
(defmulti multimethod-with-args
|
||||||
|
(fn [opt-one opt-two] opt-one))
|
||||||
|
|
||||||
|
(defmethod multimethod-with-args :path-one [_ opts]
|
||||||
|
(:first-opt opts))
|
||||||
|
|
||||||
|
(defmethod multimethod-with-args :path-two [_ opts]
|
||||||
|
(let [numbers (:second-opt opts)]
|
||||||
|
(->> numbers
|
||||||
|
(map inc)
|
||||||
|
(reduce +))))
|
||||||
|
|
||||||
|
(defmethod multimethod-with-args :path-three [_])
|
||||||
|
|
||||||
|
(meditations
|
||||||
|
"A multimethod takes an one or more arguments to dispatch on"
|
||||||
|
(= __
|
||||||
|
(multimethod-without-args :first))
|
||||||
|
|
||||||
|
"Though it can be ignored and represented by _ in defmethods"
|
||||||
|
(= __
|
||||||
|
(multimethod-without-args :second))
|
||||||
|
|
||||||
|
"Alternatively, we can use the arguments in defmethods"
|
||||||
|
(= __
|
||||||
|
(multimethod-with-args :path-one {:first-opt 1
|
||||||
|
:second-opt 2}))
|
||||||
|
|
||||||
|
"This allows us to something different in each method implementation"
|
||||||
|
(= __
|
||||||
|
(multimethod-with-args :path-two {:first-opt 1
|
||||||
|
:second-opt [0 1 2]})))
|
||||||
Loading…
Reference in a new issue