Hi Meikel,

It seems to me that your version is the only safe one so far, that
would succesfully indefinitely return values with this test:

(dorun (mystery-function true? :foo (repeat true)))

Mine, a new version of mine I'll never bother to publish, and
Christophe's all retain head.
To explain on Christophe's one for example:

It uses (split-with) which, in case pred always match coll elements,
will retain the head of coll in etc, while eating more and more
elements of coll via running on run :
1:21 user=> (defn mystery-function [pred coll]
 (lazy-seq
   (when (seq coll)
     (let [[run etc] (split-with pred coll)]
       (if (seq run)
         (concat run (cons :foo (mystery-function pred etc)))
         (cons (first coll) (mystery-function pred (rest coll))))))))
1:22 user=> (dorun (mystery-function true? (repeat true)))
java.lang.OutOfMemoryError: GC overhead limit exceeded (repl-1:22)

HTH,

-- 
Laurent

2009/4/22 Meikel Brandmeyer <m...@kotka.de>:
> Hi Micheal,
>
> Am 22.04.2009 um 21:18 schrieb Michael Wood:
>
>> Your version gives the same answer as mine, but I believe what he
>> wants is something that skips over all the elements that pass the test
>> and only inserts one instance of o after them.  That's why in his
>> example there is not a :foo after 1, but only after 5.
>>
>> Laurent's version gets this right.
>
> Oops. Sorry, misread the message. Another try.
>
> (defn mystery-function
>  [f o s]
>  (let [step (fn step [b s]
>               (lazy-seq
>                 (if-let [s (seq s)]
>                   (let [fst (first s)]
>                     (cond
>                       (and (f fst) b) (cons fst (step b (rest s)))
>                       b     (cons o (step false s))
>                       :else (cons fst (step (f fst) (rest s)))))
>                   (when b (list o)))))]
>    (step false s)))
>
> Sincerely
> Meikel
>
>

--~--~---------~--~----~------------~-------~--~----~
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
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