(define-datatype target target? (direct-target (expval expval?)) (indirect-target (ref ref-to-direct-target?)) ) (define expval? (lambda (val) (or (number? val) (procval? val)) ) ) (define ref-to-direct-target? (lambda (val) (and (reference? val) (cases reference val (a-ref (pos vec) (cases target (vector-ref vec pos) (direct-target (v) #t) (indirect-target (v) #f) )) )) ) ) (define primitive-deref deref) (define deref (lambda (ref) (cases target (primitive-deref ref) (direct-target (expval) expval) (indirect-target (ref-ref) (cases target (primitive-deref ref-ref) (direct-target (expval) expval) (indirect-target (p) (eopl:error 'deref "Illegal reference: ~s" ref-ref)) )) ) ) ) (define primitive-setref! setref!) (define setref! (lambda (ref expval) (let ((target-ref (cases target (primitive-deref ref) (direct-target (aval) ref) (indirect-target (aref) aref)))) (primitive-setref! target-ref (direct-target expval)) ) ) )