clojureでマルチメソッドを試してみる

JavaオーバーロードClojureではどうやって表現するだろうと疑問に思い調べてみました。
結論としては、マルチメソッドを使用すれば可能。
以下は簡単なサンプル。

user> (defmulti hoge class)
#'user/hoge
user> (defmethod hoge String [x]
	(str "String " x))
#<MultiFn clojure.lang.MultiFn@77b4ee5e>
user> (defmethod hoge Integer [x]
	(str "Integer " x))
#<MultiFn clojure.lang.MultiFn@77b4ee5e>
user> (defmethod hoge nil [x]
	(str "nil " x))
#<MultiFn clojure.lang.MultiFn@77b4ee5e>
user> (hoge "1")
"String 1"
user> (hoge 1)
"Integer 1"
user> (hoge nil)
"nil "

それぞれhoge関数に文字列、数値、nilを渡すと返る値が異なっています。