;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; This is the file types.scm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; The bottom level typing system (define attach-tag cons) (define (type-tag datum) (if (pair? datum) (car datum) (error "Bad typed datum -- TYPE-TAG" datum))) (define (contents datum) (if (pair? datum) (cdr datum) (error "Bad typed datum -- CONTENTS" datum))) ;;; The apply-generic mechanism. ;;; Note that we don't deal with coercion here. (define (apply-generic op . args) (let ((type-tags (map type-tag args))) (let ((proc (get op type-tags))) (if proc (apply proc (map contents args)) (error "No method for the given types -- APPLY-GENERIC" (list op type-tags))))))