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.

Reply via email to