(define make-type (let ((type-id 0)) (lambda (name) (set! type-id (+ 1 type-id)) (cons type-id name)))) (define make-typed-object (lambda (type value) (cons type value))) (define typed-object-value (lambda (type object) (if (eq? type (car object)) (cdr object) (error "type mismatch")))) (define typed-object-predicate (lambda (type) (lambda (value) (and (pair? value) (eq? type (car value))))))