It sounds to me that you want to use c.c.seq-utils/group-by, not distinct. On Feb 22, 7:22 am, Eugen Dueck <eu...@dueck.org> wrote: > 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