s/:ignore/::ignore

In any case, it's a less than elegant solution since it the map will
generate superfluous items;  I just wanted to a solution composing
together higher-order functions.



On Oct 14, 4:43 am, Laurent PETIT <laurent.pe...@gmail.com> wrote:
> So in your function, :ignore is not a possible values within the compared
> seqs :-(
>
> 2009/10/14 ataggart <alex.tagg...@gmail.com>
>
>
>
>
>
> > How about something like this:
>
> > (filter #(not= % :nomatch) (map #(if (= %1 %2) %1 :nomatch) [1 2 3 4]
> > [1 3 3 3]))
>
> > Or cleaned up for general use:
>
> > (defn filter-map
> >  "Returns the results of map, but filtered to contain only those
> > items whose inputs to f have satisfied pred. pred takes the same args
> > as f and must be side-effect free."
> >  [pred f & colls]
> >  (filter #(not= % :ignore)
> >          (apply map #(if (apply pred %&)
> >                        (apply f %&)
> >                        :ignore)
> >                 colls)))
>
> > user=> (filter-map = #(first %&) [1 2 3 4] [1 5 3 7])
> > (1 3)
>
> > On Oct 13, 11:06 pm, Mark Tomko <mjt0...@gmail.com> wrote:
> > > This is basically a problem of parallel iteration.  I've devised 2
> > > solutions, one is recursive (alas, not tail-recursive) and the other
> > > appears to be a more idiomatic Clojure solution.  Can someone suggest
> > > a more efficient or cleaner solution?
>
> > > Here's the "literal" solution:
>
> > > (defn matching-elements [coll1 coll2]
> > >   (if (or (empty? coll1) (empty? coll2)) ()
> > >     (let [e1 (first coll1) e2 (first coll2)]
> > >       (if (= e1 e2) (cons e1 (matching-elements (rest coll1) (rest
> > > coll2)))
> > >         (matching-elements (rest coll1) (rest coll2))))))
>
> > > In this implementation, we first check the base case, where one of the
> > > sequences is empty.  If one of the sequences is empty, we return an
> > > empty list.  Otherwise, we check to see if the first elements in each
> > > list are equal.  If so, we return the list resulting from the addition
> > > of the matching element to the result of the recursive call to the
> > > method on the remaining elements in each list.  Otherwise, we simply
> > > return the result of the recursive call to the method on the remaining
> > > elements in each list.
>
> > > I believe that the cons prevents the use of recur to make this tail
> > > recursive.
>
> > > After a little digging and reading through a thread on this group
> > > about parallel iteration, I devised the following alternative
> > > solution, which makes use of lazy sequences:
>
> > > (defn matching-elements2 [coll1 coll2]
> > >   (map first (filter #(let [[e1 e2] %] (= e1 e2)) (partition 2
> > > (interleave coll1 coll2)))))
>
> > > Can anyone suggest an improved implementation of either
> > > implementation?
>
> > > Thanks!
--~--~---------~--~----~------------~-------~--~----~
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