Hi,
On 26 Apr., 13:27, Per Vognsen <[email protected]> wrote:
> Okay, that is a blatant infinite loop that has nothing to do with
> deadlocks. I give up. This combination of laziness and concurrency and
> locking is giving me a headache. Sorry about the distraction,
> everyone.
Well, we can step through the code and see whether this sheds some
light on the issue.
Calling .seq on zs, which is meant by "forcing", I believe.
zs.seq()
sval()
; fn != null since zs was not forced before.
sv = fn.invoke()
; sv is a Cons, namely (cons 26 as)
fn = null
return sv
; Up to now no chance of deadlock. Back to seq()
; sv != null
ls = sv
sv = null
; a Cons is not an instance of LazySeq
s = RT.seq(ls)
; s == ls since .seq is the identity on a Cons
return s
; Still no chance of deadlock.
There is no other way to force a sequence in Clojure than traversing
it
via next/rest, which implicitely call seq on the rest. So even in the
circular case there is no chance of deadlock.
The recursive .sval() call is for lazy-seq evaluating to lazy-seqs.
ie. (lazy-seq (lazy-seq ...)). Here - again - is no chance of
deadlock.
Does this make sense?
Sincerely
Meikel
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en