I took a stab at it in pure core.async, unfortunately, it does not work; I 
would be curious if anyone could explain why.

(use '[clojure.core.async :only [timeout <! go <!! alts!]])

(defn fib [n tmout]
  (let [res (go (if (< n 2)
                  n
                  (let [r1 (<! (fib (- n 1) tmout))
                        r2 (<! (fib (- n 2) tmout))]
                    (when (and r1 r2) (+ r1 r2)))))]
    (go
     (first (alts! [res tmout])))))

(time (<!! (fib 30 (timeout 1000))))


By my reading, it seems like every go machine has a 50% chance of being 
killed if the timeout has fired. I would expect it to take a little longer 
than that to unwind all the existent go machine "stacks", but then it 
should terminate. Not at all what happens. Although control returns 
properly within the timeout, the cpu time per call to fib appears the same 
regardless of what value of timeout I pick. I have several guesses about 
what might be wrong, but probably just easier to ask if anyone knows what 
is wrong. :)

-- 
-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to