boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

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)