Yes, multimethod handles varargs. On Wednesday, January 11, 2017 at 4:37:12 PM UTC-6, david swift wrote: > > Ah seems the repl state was the cause, restarted and the ordering worked > correctly though it still confuses me greatly! but I'll get there > eventually (I hope). as for the extra ')' that was manually retyping into > forum error :) > > Using nightcode editor's insta-repl for testing and seems it doesn't > refresh the changes. Also does mutlimethod handle varargs? purely for > testing purposes, doubt it'll be used but just incase > > On Wednesday, 11 January 2017 22:29:00 UTC, Alex Miller wrote: >> >> >> >> On Wednesday, January 11, 2017 at 4:23:28 PM UTC-6, david swift wrote: >>> >>> Been working on a tiny snippet of code related to multimethods >>> (something I've never quite wrapped my head around) and when it comes to >>> the dispatching of the function I'm confused by the order in which I've to >>> pass the arguments in as it seems to go against all common sense. >>> >>> To show what I am trying to do (to begin with); ignoring name >>> conflictions. Without implementing algorithm details I supply a simple >>> string for ease. >>> (defmulti transform (fn [language data] language)) >>> >>> (defmethod transform :html >>> [_ data] >>> (str data " will be transformed into html"))) >>> >> >> ^ extra ) at the end there fyi >> >> >>> >>> >>> (defmethod transform :java-fx >>> [_ data] >>> (str data " will be transformed into javafx")) >>> >>> What I would expect from this outcome would be to do the following on >>> dispatch >>> (transform :html "some data") => "some data will be transformed into >>> html" >>> >> >> This is what I see and that looks right to me. I suspect you somehow have >> old method impls in your repl state. You should try with a fresh repl. >> >> >>> >>> But instead the output I actually get ends up being >>> "some data" >>> which I assume to be the default for mulitmethods to return the data >>> value. Though if I were to instead to change the order of the arguments >>> like so. >>> >>> (transform "some data" :html) => "some data will be transformed into >>> html" >>> The expect outcome I wanted but not with the "correct" argument order I >>> was expecting, and to also note this (for me) prevents me from having more >>> than one argument and dispatch case. >>> >> >> I get >> >> IllegalArgumentException No method in multimethod 'transform' for >> dispatch value: some data clojure.lang.MultiFn.getFn (MultiFn.java:156) >> >> >> I know that I can do this approach >>> (transform {:language :html} "some data") >>> and it would work in the correct order but it's extra data I'm looking >>> to avoid for the sake of correct argument order >>> >>> Ideally I would of like the code to look something like below >>> (defmulti transform :language) >>> >>> (defmethod transform :html >>> [data] >>> (str data " will be transformed into html")) >>> >>> (defmethod transform :java-fx >>> [data] >>> (str data " will be transformed into javafx")) >>> >>> I'd be grateful if someone could give me some simple examples to go by >>> that work by keyword dispatch that isn't foobaz, thank you :) >>> >>
-- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.