ikarus/scheme/ikarus.guardians.ss

25 lines
720 B
Scheme

;;; The procedure make-guardian is coped en verbatim
;;; from Dybvig et al. Guardians paper.
(library (ikarus guardians)
(export make-guardian)
(import (except (ikarus) make-guardian))
(define make-guardian
(lambda ()
(let ([tc
(let ([x (cons #f #f)])
(cons x x))])
(case-lambda
[()
(and (not (eq? (car tc) (cdr tc)))
(let ([x (car tc)])
(let ([y (car x)])
(set-car! tc (cdr x))
(set-car! x #f)
(set-cdr! x #f)
y)))]
[(obj)
(foreign-call "ikrt_register_guardian_pair" (cons tc obj))
(void)])))))