Quick clojure question, I think this is mostly syntax related. How do I dispatch a multimethod based on specific type signatures of the arguments, for example:
(defn foo 
     ([String a String b] (println a b))
     ([Long a Long b] (println (+ a b))
     ([String a Long b] (println a (str b))))
I want to extend this to arbitrary stuff, eg two strings followed by a map, to maps followed by a double, two doubles followed by an IFn etc...
(defn class2 [x y]
  [(class x) (class y)])
(defmulti foo class2)
(defmethod foo [String String] [a b]
  (println a b))
(defmethod foo [Long Long] [a b]
  (println (+ a b)))
From the REPL:
user=> (foo "bar" "baz")
bar baz
nil
user=> (foo 1 2)
3
nil
You could also consider using type instead of class; type returns :type metadata, delegating to class if there is none.
Also, class2 does not have to be defined at top level; passing (fn [x y] ...) as the dispatch function to defmulti is fine too.
If you use type instead of class, the code will also work in ClojureScript.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With