Your example works for me as follows: user> (defn- discern
([this-users-conversation] {:pre [(map? this-users-conversation)]} (:intent this-users-conversation)) ([this-users-conversation salesforce-object-name] {:pre [(map? this-users-conversation) (string? salesforce-object-name)]} (:intent this-users-conversation)) ([this-users-conversation salesforce-object-name name-of-attribute] {:pre [(map? this-users-conversation) (string? salesforce-object-name) (string? name-of-attribute)]} (:intent this-users-conversation)) ([this-users-conversation salesforce-object-name name-of-attribute name-of-intent] {:pre [(map? this-users-conversation) (string? salesforce-object-name) (keyword? name-of-attribute) (string? name-of-intent)]} name-of-intent)) #'user/discern user> (defmulti intent (fn [& args] (apply discern args))) #'user/intent user> (defmethod intent nil [& args] (str "I got nil plus " args)) #object[clojure.lang.MultiFn 0x40954538 "clojure.lang.MultiFn@40954538"] user> (defmethod intent "query-salesforce-for-attribute" [& args] (str "SQFFA " args)) #object[clojure.lang.MultiFn 0x40954538 "clojure.lang.MultiFn@40954538"] user> (defmethod intent :default [& args] (str "WAT? " args)) #object[clojure.lang.MultiFn 0x40954538 "clojure.lang.MultiFn@40954538"] user> (def this-users-conversation {}) #'user/this-users-conversation user> (intent this-users-conversation "Opportunity" :Name "query-salesforce-for-attribute") "SQFFA ({} \"Opportunity\" :Name \"query-salesforce-for-attribute\")" user> (intent this-users-conversation "Opportunity" "Name") "I got nil plus ({} \"Opportunity\" \"Name\")" user> (intent {:intent "do-something"} "Opportunity" "Name") "WAT? ({:intent \"do-something\"} \"Opportunity\" \"Name\")" Sean Corfield -- (904) 302-SEAN An Architect's View -- http://corfield.org/ "If you're not annoying somebody, you're not really alive." -- Margaret Atwood From: <clojure@googlegroups.com> on behalf of Lawrence Krubner Reply-To: <clojure@googlegroups.com> Date: Wednesday, September 30, 2015 at 5:33 PM To: Clojure Subject: can I use varargs in a multimethod? >For maximum flexibility I wanted to use a multimethod, defined like this: > > >(defmulti intent > (fn [& args] > (apply discern args))) > > >This is how discern is defined: > >(defn- discern > > ([this-users-conversation] > {:pre [(map? this-users-conversation)]} > (:intent this-users-conversation)) > > ([this-users-conversation salesforce-object-name] > {:pre [(map? this-users-conversation) > (string? salesforce-object-name)]} > (:intent this-users-conversation)) > > ([this-users-conversation salesforce-object-name name-of-attribute] > {:pre [(map? this-users-conversation) > (string? salesforce-object-name) > (string? name-of-attribute)]} > (:intent this-users-conversation)) > > ([this-users-conversation salesforce-object-name name-of-attribute > name-of-intent] > {:pre [(map? this-users-conversation) > (string? salesforce-object-name) > (keyword? name-of-attribute) > (string? name-of-intent)]} > name-of-intent)) > > >but then I call the multimethod like this: > >(intent this-users-conversation "Opportunity" :Name >"query-salesforce-for-attribute") > > >and I get: > >:class clojure.lang.ArityException, >:message "Wrong number of args (4) passed to: query/fn--65", > > >Should I give up on this idea, or is there a way to make this work? > > -- 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.