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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.