git.fiddlerwoaroof.com
type/type-main.scm
4e987026
 
 ;;; This is the main entry point to the type checker.
 
 
 (define (do-haskell-type-check object modules)
   (type-init modules)
   (when (is-type? 'let object) ; may be void
     (dynamic-let ((*non-generic-tyvars* '())
 		  (*placeholders* '())
 		  (*enclosing-decls* '()))
       (type-check/decls let decls
 	 (setf (dynamic *non-generic-tyvars*) '())
          (process-placeholders (dynamic *placeholders*) '() '()))))
   'done)
 
 ;;; This is the main recursive entry to the type checker.
 
 (define (dispatch-type-check exp)
  (remember-context exp
   (call-walker type exp)))
 
 (define (do-type-check/list exps)
   (if (null? exps)
       (values '() '())
       (mlet (((obj1 type1) (dispatch-type-check (car exps)))
 	     ((objs types) (do-type-check/list (cdr exps))))
 	(values (cons obj1 objs) (cons type1 types)))))
 
 (define (type-init modules)
   ;; Built in types
   (setf *char-type* (**ntycon (core-symbol "Char") '()))
   (setf *string-type* (**ntycon (core-symbol "List")
 				(list *char-type*)))
   (setf *bool-type* (**ntycon (core-symbol "Bool") '()))
   (setf *int-type* (**ntycon (core-symbol "Int") '()))
   (setf *integer-type* (**ntycon (core-symbol "Integer") '()))
   (setf *rational-type* (**ntycon (core-symbol "Ratio")
 				  (list *integer-type*)))
   (setf *default-decls* '())
   (dolist (m modules)
     (let ((default-types '()))
       (dolist (d (default-decl-types (module-default m)))
         (let* ((ty (ast->gtype '() d))
 	       (ntype (gtype-type ty)))
 	  (cond ((not (null? (gtype-context ty)))
 		 (recoverable-error 'not-monotype
 		   "~A is not a monotype in default decl" ty))
 		((not (type-in-class? ntype (core-symbol "Num")))
 		 (recoverable-error 'not-Num-class
 		   "~A is not in class Num" ty))
 		(else
 		 (push ntype default-types)))))
       (push (tuple (module-name m) (reverse default-types)) *default-decls*))))
 
 (define (remember-placeholder placeholder)
   (push placeholder (dynamic *placeholders*)))