Re: Weird behaviour of SRFI-127 lseq in a multithreaded program

Kon Lovett via Chicken-users <[email protected]> Sun, 22 Feb 2026 13:30:14 -0800
Newsgroups gmane.lisp.scheme.chicken
Message-ID <[email protected]>
sorry, i didn’t look at the actual document & the eager for-each seemed out of place.

yes, needs updating. definitely send the egg author a note about it

> On Feb 22, 2026, at 1:08 PM, Stanislav Kljuhhin <[email protected]> wrote:
> 
> OK, I should probably have figured this out earlier myself.
> 
> The egg sources are not entirely up-to-date with upstream and miss this commit:
> https://github.com/scheme-requests-for-implementation/srfi-127/commit/7976fce401da8ac368ada1914c5fbaba715aa246
> 
> https://srfi-email.schemers.org/srfi-127/msg/21875262/
> 
> —
> Stan
> 
> 
>> On 22 Feb 2026, at 20:20, Kon Lovett <[email protected]> wrote:
>> 
>> ;; Eagerly apply a proc to the elements of lseqs
>> ;; Included because it's a common operation, even though it is trivial
>> (define (lseq-for-each proc . lseqs)
>>  (apply for-each proc (map lseq-realize lseqs)))
>> 
>> lseq-for-each* applies the proc before processing the remaining list, not the egg source.
>> 
>> 
>>> On Feb 22, 2026, at 10:22 AM, Stanislav Kljuhhin via Chicken-users <[email protected]> wrote:
>>> 
>>> Hello,
>>> 
>>> Consider the following minimal example:
>>> 
>>> ---8<---
>>> (import srfi-18)
>>> (import srfi-121)
>>> (import srfi-127)
>>> 
>>> (define (emit yield)
>>> (let loop ((i 1))
>>>   (thread-sleep! 1)
>>>   (yield "hello")
>>>   (when (< i 10)
>>>     (loop (add1 i)))))
>>> 
>>> (define (collect s)
>>> (display s)
>>> (newline))
>>> 
>>> (define (lseq-for-each* proc lseq)
>>> (unless (null? lseq)
>>>   (proc (lseq-car lseq))
>>>   (lseq-for-each* proc (lseq-cdr lseq))))
>>> 
>>> (lseq-for-each collect (generator->lseq (make-coroutine-generator emit)))
>>> ---8<—--
>>> 
>>> When I run this program (compiled or interpreted, makes no difference), nothing
>>> happens for 10 seconds, then 10 hello's are printed at once. But if I use the
>>> in-place implementation lseq-for-each*, then the program behaves as one might
>>> expect, i.e. hello's are printed with a 1-second interval.
>>> 
>>> Here I used a simplified implementation of lseq-for-each*, just for brevity, but
>>> we can copy the SRFI-127 implementation verbatim, and it still works the same.
>>> 
>>> Can you help me understand what is going on, please?
>>> 
>>> —
>>> Stan
>> 
>