Suggestion: ephemeron-case Daphne Preston-Kendal (04 Feb 2025 10:08 UTC)
Re: Suggestion: ephemeron-case John Cowan (04 Feb 2025 11:35 UTC)
Re: Suggestion: ephemeron-case Vincent Manis (he/him) (04 Feb 2025 19:38 UTC)
Re: Suggestion: ephemeron-case Marc Nieper-Wißkirchen (05 Feb 2025 15:12 UTC)
Re: Suggestion: ephemeron-case Daphne Preston-Kendal (05 Feb 2025 15:30 UTC)
Re: Suggestion: ephemeron-case Marc Nieper-Wißkirchen (05 Feb 2025 18:04 UTC)
Re: Suggestion: ephemeron-case Daphne Preston-Kendal (05 Feb 2025 18:16 UTC)
(missing)
Fwd: Suggestion: ephemeron-case Marc Nieper-Wißkirchen (16 Mar 2025 13:19 UTC)
Re: Suggestion: ephemeron-case Marc Nieper-Wißkirchen (12 May 2025 11:51 UTC)
Re: Suggestion: ephemeron-case Arthur A. Gleckler (10 Jun 2025 23:16 UTC)
Re: Suggestion: ephemeron-case Daphne Preston-Kendal (03 Aug 2025 09:38 UTC)
Re: Suggestion: ephemeron-case Marc Nieper-Wißkirchen (03 Aug 2025 15:29 UTC)
Re: Suggestion: ephemeron-case Marc Nieper-Wißkirchen (03 Aug 2025 15:30 UTC)
Re: Suggestion: ephemeron-case Daphne Preston-Kendal (09 Oct 2025 12:34 UTC)
Re: Suggestion: ephemeron-case Marc Nieper-Wißkirchen (09 Oct 2025 13:24 UTC)
Usefulness of reference-barrier Daphne Preston-Kendal (12 Oct 2025 20:16 UTC)
Re: Usefulness of reference-barrier Marc Nieper-Wißkirchen (13 Oct 2025 05:58 UTC)
Re: Usefulness of reference-barrier Marc Nieper-Wißkirchen (13 Oct 2025 07:21 UTC)
Re: Usefulness of reference-barrier Marc Nieper-Wißkirchen (13 Oct 2025 11:17 UTC)
Re: Usefulness of reference-barrier Marc Nieper-Wißkirchen (22 Oct 2025 07:18 UTC)
Re: Usefulness of reference-barrier Daphne Preston-Kendal (30 Oct 2025 22:46 UTC)
Re: Usefulness of reference-barrier Marc Nieper-Wißkirchen (31 Oct 2025 07:50 UTC)
Re: Usefulness of reference-barrier Daphne Preston-Kendal (30 Oct 2025 23:03 UTC)
Re: Usefulness of reference-barrier Marc Nieper-Wißkirchen (31 Oct 2025 08:02 UTC)
Re: Usefulness of reference-barrier Marc Nieper-Wißkirchen (04 Nov 2025 18:57 UTC)

Re: Suggestion: ephemeron-case Marc Nieper-Wißkirchen 09 Oct 2025 13:24 UTC

Thank you very much for your response!

Am Do., 9. Okt. 2025 um 14:34 Uhr schrieb Daphne Preston-Kendal
<xxxxxx@nonceword.org>:
>
> > Am So., 3. Aug. 2025 um 17:29 Uhr schrieb Marc Nieper-Wißkirchen
> > <xxxxxx@gmail.com>:
> >>
> >> Maybe I don't understand the semantics of your ephemeron-case form.
> >> Reading your first post, there does not seem to be a reference barrier
> >> on the key in the broken path. Can you give a syntax-case definition
> >> of ephemeron case?
>
>
> (define-syntax ephemeron-case
>   (syntax-rules (else)
>     ((_ eph-expr
>         ((k-id . v-id) expr_0 expr_1 ...)
>         (else broken-expr_0 broken-expr_1 ...))
>      (let* ((eph eph-expr)
>             (k (ephemeron-key eph))
>             (v (ephemeron-value eph))) ; why has this name been changed? grr
>        (if (ephemeron-broken? eph)
>            (begin broken-expr_0 broken-expr_1 ...)
>            (let-syntax ((k-id (identifier-syntax k))
>                         (v-id (identifier-syntax v)))
>              (dynamic-wind
>                (lambda () #f)
>                (lambda () expr_0 expr_1 ...)
>                (lambda () (reference-barrier k)))))))))
>
> > On 3 Aug 2025, at 17:30, Marc Nieper-Wißkirchen <xxxxxx@gmail.com> wrote:
> >
> > PS And maybe give a simple example of how a user would typically use it.
>
> (define (ephemeron-alist-ref ephal key)
>   (let loop ((more ephal))
>     (if (null? more)
>         (assertion-violation 'ephemeron-alist-ref "nothing found for key" ephal)
>         (ephemeron-case (car ephal)
>           ((found-key . value)
>            (if (eqv? found-key value)
>                value
>                (loop (cdr more))))
>           (else (loop (cdr more)))))))

[You likely mean "(eqv? found-key key)" here, I guess.]

Thank you for the example code. Unfortunately, the suggested
definition of "ephemeron-case" is useless. If there is no future call
of reference-barrier on K (in the case of ephemeron-case) or KEY (in
case of ephemeron-alist-ref), the compiler may elide the whole
not-broken-branch of ephemeron case (which is, a posteriori, correct
because reference-barrier won't be called in that case). But there is
a future call of reference-barrier on K/KEY, the call within
ephemeron-case is superfluous.

This is the semantics: "The GC can break an ephemeron if, under the
assumption that it is broken, the key will not be kept alive."

To correctly work with ephemerons, the user has to explicitly call
reference-barrier or procedures that document that they keep certain
values alive (unconditionally). See the example here:
https://srfi-email.schemers.org/srfi-254/msg/27973433/

Marc