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