I'm implementing srfi-226 delay/force semantics in Gauche natively, and one
test breaks---srfi-155.  The reference implementation of srfi-155 builds on
top of R7RS semantics delay.  So it is logical that changing built-in
delay/force semantics affects it.

I don't think it affects srfi-226; Just want to record the experience here.



On Sat, Mar 11, 2023 at 9:29 AM Shiro Kawai <shiro.ka...@gmail.com> wrote:

> Gauche has been mutexing realization of a promise, but srfi-226 is the
> right thing; evaluation of the body may communicate to another thread that
> may take the value of the promise.  Current Gauche deadlocks in that case.
>
> By the way, in the reference implementation, 'force' has this code:
>
>    (if (promise-done? p)
>        ((promise-thunk p))
>        (call-with-immediate-continuation-mark ....))
>
> And:
>
>    (promise-lock! p)
>    ...
>    (promise-done?-set! p (promise-done? q))
>    (promise-thunk-set! p (promise-thunk q)))
>    ...
>    (promise-unlock! p)
>
> First I thought you need to lock promise to check promise-done? and
> retrieve promise-thunk, otherwise you may read the old value of
> promise-thunk and reevaluate  the body.  However, it is allowed that the
> body is evaluated multiple times, it's ok.  Am I understanding it right?
>
>
>
>
>
>
>
>
>
>
> On Sat, Mar 11, 2023 at 3:02 AM Marc Nieper-Wißkirchen <
> marc.nie...@gmail.com> wrote:
>
>> Am Sa., 11. März 2023 um 11:11 Uhr schrieb Shiro Kawai <
>> shiro.ka...@gmail.com>:
>> >
>> > From the srfi text, it is allowed that the delay's body to be evaluated
>> by more than one thread simultaneously; only that the result of force is
>> the result of the first delivered result.  Am I right?
>>
>> Indeed.  This is analogous to promises being forced while their "body"
>> is evaluated, even in the same thread.
>>
>> >
>>
>

Reply via email to