Feature request: guardian-try-collect Daphne Preston-Kendal (30 Nov 2023 23:33 UTC)
(missing)
Re: Feature request: guardian-try-collect Daphne Preston-Kendal (01 Dec 2023 07:56 UTC)
Re: Feature request: guardian-try-collect John Cowan (03 Dec 2023 05:16 UTC)
Re: Feature request: guardian-try-collect Daphne Preston-Kendal (03 Dec 2023 09:45 UTC)
Re: Feature request: guardian-try-collect John Cowan (03 Dec 2023 17:51 UTC)
Re: Feature request: guardian-try-collect Daphne Preston-Kendal (04 Dec 2023 12:19 UTC)
Re: Feature request: guardian-try-collect Marc Nieper-Wißkirchen (14 Dec 2023 15:06 UTC)

Re: Feature request: guardian-try-collect Daphne Preston-Kendal 03 Dec 2023 09:45 UTC

On 3 Dec 2023, at 06:15, John Cowan <xxxxxx@ccil.org> wrote:

> On Thu, Nov 30, 2023 at 6:34 PM Daphne Preston-Kendal <xxxxxx@nonceword.org> wrote:
>
>> I would like to propose an additional procedure, guardian-try-collect. When called on a guardian, it instructs the garbage collector to do as much collection as might be required to enqueue one object in the guardian for finalization.
>
> I think this is the same as the `guardian-wait` procedure described by Marc Feeley in <https://srfi-email.schemers.org/srfi-246/msg/23507606/>.

Marc’s proposal seems to be to block the thread until the next garbage collection happens to run anyway. Mine is to request an immediate garbage collection without ‘blocking’ in that sense. I think mine is the better solution since it does not depend on threading to work. It’s not clear to me how the unwind-protect case could be solved by Marc’s solution.

> I think that your definition of unwind-protect should be added to the SRFI.

If so, use this one:

(define-syntax unwind-protect
  (syntax-rules ()
    ((_ protected-form finalization-form)
     (let ((g (make-guardian)))
       (dynamic-wind
         (lambda () #f)
         (lambda ()
           (let ((p (cons 'p '()))) ; p will only be alive as long as
                                    ; the continuation of
                                    ; unwind-protect is still alive
             (g p)
             (begin0 protected-form
               (reference-barrier p)))
           (lambda ()
             (guardian-try-collect g) ; try to collect p
             (when (g)
               finalization-form))))))))

which uses the begin0 form to be multiple-value safe for the protected-form. Since that isn’t in any SRFI yet (although it is in the R6RS operational semantics), you can put this portable implementation in with it if you think it necessary:

(define-syntax begin0
  (syntax-rules ()
    ((_ expr_0 expr_1 ...)
     (call-with-values
         (lambda () expr_0)
       (lambda x
         expr_1 ...
         (apply values x))))))

Daphne