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

Reply via email to