Yes, for the reasons stated. First, and most important, clojure.core/distinct does not let me pass in a keyfn, it's hard-coded.
Second, and as mentioned that's debatable, distinct could make more of the filtering functionality it already has available to the caller, for free. On Feb 22, 11:53 am, Wilson MacGyver <wmacgy...@gmail.com> wrote: > Any reason why you can't use > distinct? > > http://richhickey.github.com/clojure/clojure.core-api.html#clojure.co... > > On Feb 21, 2010 10:24 AM, "Eugen Dueck" <eu...@dueck.org> wrote: > > Hi, > > Clojure is great! The gain in productivity from more low level > languages like Java, but also more functional languages like Ruby and > Common LISP etc. amazes me every day. Like how adding a simple "map" > in front of the count here: > (count colls) > changes the code from counting the number of collections to > enumerating the number of items in those collections. It's all these > little things that take one minute or 5 in Java, but only 5 seconds in > Clojure (in case you are a slow typer) that make you so much more > efficient. With clojure, I spend most of my time thinking about > problems at a conceptual level, rather than at the implementation > level (Java: int[] vs. Iterable<Integer> vs. List<Integer> vs. > Integer[] etc. - arrg!). Thanks Rich! > > That said, every now and then I come across a function in clojure.core > that could be vastly improved in its range of applicability by just > adding one or more optional parameters, defaulting to the currently > hard-coded values (like the often implicit 'identity' function). Take > 'distinct'. I'd like to be able to specify the keyfn, that's an > important one for me, and while we're at it, I'd like to pass in the > set that that function builds up incrementally, and normally starts > with an empty set, so that I can pre-initialize it, say with #{ nil }, > so that it also filters out nils. > > This 2nd point is not that important, and I'm not sure if it is that > great an idea in terms of "orthogonality" of the functions, as we have > filter. But you'd get rid off one level of indirection. distinct > basically gives us a filter for free. > > But the 1st point I think certainly makes sense, and we have a couple > of other fns in clojure that have a variant with a keyfn parameter, > like sort-by etc. I guess they normally get a different name. > > I'm not so sure about what the best order of parameters is in clojure, > and named parameters would make this a no brainer, but this is what I > currently use, the first parameter being coll, at least in the variant > with only one parameter that makes it a drop-in replacement candidate > for distinct: > > (defn distinkt > "Returns a lazy sequence of the elements of coll with duplicates > removed" > ([coll] (distinkt coll identity)) > ([coll keyfn] (distinkt coll keyfn #{})) > ([coll keyfn seen-items] > (let [step (fn step [xs seen] > (lazy-seq > ((fn [[f :as xs] seen] > (when-let [s (seq xs)] > (let [key (keyfn f)] > (if (contains? seen key) > (recur (rest s) seen) > (cons f (step (rest s) (conj seen key))))))) > xs seen)))] > (step coll seen-items)))) > > I don't mind writing - or better - copy-and-pasting this code and > keeping it in my project, but I think it could be useful for others, > so I wouldn't mind at all if this makes it into clojure.core... :) > > Or is the reason for hard coding an (implicit) 'identity' performance? > Or did I miss some other way to achieve the same goal? > > Eugen > > -- > 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<clojure%2bunsubscr...@googlegroups.com> > For more options, visit this group > athttp://groups.google.com/group/clojure?hl=en -- 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