124-gc-record-type.scm (850B)
1 ; Record instances, type descriptors, generated parameterized primitives, 2 ; and field metadata remain live across collection. 3 4 (define-record-type dyn 5 (mk-dyn x y) 6 dyn? 7 (x dyn-x dyn-x-set!) 8 (y dyn-y dyn-y-set!)) 9 10 (define d (mk-dyn 7 8)) 11 (define td (record-td d)) 12 (collect-garbage) 13 14 (if (dyn? d) 0 (sys-exit 1)) 15 (if (eq? td (record-td d)) 0 (sys-exit 2)) 16 (if (eq? (td-name td) 'dyn) 0 (sys-exit 3)) 17 (if (= (td-nfields td) 2) 0 (sys-exit 4)) 18 19 (dyn-x-set! d (cons 7 10)) 20 (dyn-y-set! d d) 21 (collect-garbage) 22 (if (= 7 (car (dyn-x d))) 0 (sys-exit 5)) 23 (if (= 10 (cdr (dyn-x d))) 0 (sys-exit 6)) 24 (if (eq? d (dyn-y d)) 0 (sys-exit 7)) 25 26 ; pmatch reads the TD field-name list through generated accessors. 27 (if (= 17 28 (pmatch d 29 (($ dyn? (x ,x) (y ,y)) (+ (car x) (cdr (dyn-x y)))) 30 (else 0))) 31 0 32 (sys-exit 8)) 33 34 (sys-exit 42)