Hi, If I understand your pb correctly, and form what I have seen in the Scala world, there is maybe a simpler way to do it :
(defn process-args [args fnkeys fndefault] (let [[positional-args named-args] (split-with (complement keyword?) args) named-args (into {} (map vec (partition 2 named-args)))] (merge fndefault (zipmap fnkeys positional-args) named-args))) (defn f [& args] (process-args args [:a :b :c] {:a 1 :c 2})) (f "40" "abc" :b "abc2" :bb "ahoy") ;=> {:bb "ahoy", :b "abc2", :a "40", :c 2} Jon On Mon, Jul 21, 2014 at 3:34 AM, Sam Raker <sam.ra...@gmail.com> wrote: > OK! After a few false starts, I think I got it: > > (defn f [& args] (let [args (vec args) default-args-atom (atom {:a 1 :b 2 > :c 3 :d 4}) kwds [:a :b :c :d]] > (do > (dorun (map-indexed (fn [idx arg] (if > (keyword? arg) > > (swap! default-args-atom assoc arg (get args (inc idx))) > > (if (not (keyword? (get args (dec idx)))) (swap! default-args-atom > assoc (get kwds idx) arg)))) > args)) > (the-real-func (:a @default-args-atom) (:b > @default-args-atom) (:c @default-args-atom) (:d @default-args-atom))))) > > I feel like I should turn this into a macro, but I've spent enough time on > it as is, for now. > > On Sunday, July 20, 2014 8:16:55 PM UTC-4, Alex Baranosky wrote: > >> You can get keyword args like this: >> >> (defn f [& {:keys [a b c d] >> :or {a 1 b 2 c 3 d 4}}] >> [a b c d]) >> >> But you cannot also get the ability to call: >> (f 5 6 7 8) >> >> >> On Sun, Jul 20, 2014 at 4:13 PM, Sam Raker <sam....@gmail.com> wrote: >> >>> I'm trying to write a function that takes (up to) 4 arguments. I want to >>> be able to supply every argument positionally, with a keyword or as a >>> default, so that >>> >>> (f) >>> (f 1) >>> (f 1 2) >>> (f 1 2 3) >>> (f 1 2 3 4) >>> (f 1 :b 2) >>> (f 1 2 :c 3) >>> ... >>> (f :a 1 :b 2 :c 3 :d 4) >>> >>> are all equivalent. In Python, I could do this by >>> >>> def f(a=1,b=2,c=3,d=4):... >>> >>> but I'm not sure how to do it in Clojure. >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "Clojure" group. >>> To post to this group, send email to clo...@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+u...@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+u...@googlegroups.com. >>> >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > 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. > -- 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.