Hi, Interesting. Seems more readable, more DRY, indeed. Especially if this becomes idiomatic for optional named arguments ...
And the general case could be: (defn funkymonkey [x y z & {:keys [[a -1] [b -2] [c -3]], d :d, e [:e -4], :or {b -3, g -6}} [x y z a b c]) ? Which leads to the question: which default value "wins" for b ? :) 2010/3/24 Per Vognsen <per.vogn...@gmail.com>: > Those of you following the clojure repo on GitHub may have noticed this > commit: > > http://github.com/richhickey/clojure/commit/29389970bcd41998359681d9a4a20ee391a1e07c > > Now you can do things like this: > > user=> (defn funkymonkey [x y z & {:keys [a b c]}] [x y z a b c]) > #'user/funkymonkey > user=> (funkymonkey 1 2 3) > [1 2 3 nil nil nil] > user=> (funkymonkey 1 2 3 :b 5) > [1 2 3 nil 5 nil] > user=> (funkymonkey 1 2 3 :c 6 :a 4 :b 5) > [1 2 3 4 5 6] > > Very nice! It feels smoothly integrated with the general destructuring > infrastructure. You can also supply default values with the :or > binder: > > user=> (defn funkymonkey [x y z & {:keys [a b c] :or {a -1 b -2 c -3}] > [x y z a b c]) > #'user/funkymonkey > user=> (funkymonkey 1 2 3) > [1 2 3 -1 -2 -3] > user=> (funkymonkey 1 2 3 :b 5) > [1 2 3 -1 5 -3] > > The great thing about :keys is that it cuts down on redundancy: you > specify a symbol only once and it is dually interpreted as a map > keyword and a lexically bound symbol. Since :keys already expects a > flat sequence of symbols rather than arbitrary nested binding forms > (otherwise this trick of dual interpretation wouldn't work), you could > further cut down on the redundancy in the above :keys/:or idiom (which > I expect would become commonplace with named arguments) by letting > :keys elements optionally be two-element vectors with the second > element supplying the default value: > > user=> (defn funkymonkey [x y z & {:keys [[a -1] [b -2] [c -3]]] [x y z a b > c]) > > What do you think? I hacked this into my local version of core.clj's > destructure and it feels very natural to me. > > -Per > > -- > 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 > > To unsubscribe from this group, send email to > clojure+unsubscribegooglegroups.com or reply to this email with the words > "REMOVE ME" as the subject. > -- 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 To unsubscribe from this group, send email to clojure+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.