git.fiddlerwoaroof.com
Raw Blame History
;;; These structures are used by the type checker for the internal
;;; representation of type information.  These are referred to in
;;; general as `ntype' structures.  Conversions are required between
;;; ast types and ntypes.

(define-struct ntype
  (include ast-node))

(define-struct ntycon
  (include ntype)
  (predicate ntycon?)
  (slots
   (tycon (type def))
   (args (type (list ntype)))))

(define-struct ntyvar
  (include ntype)
  (predicate ntyvar?)
  (slots
   ;; non-instantiated tyvars use #f for a value.
   (value (type (maybe ntype)))
   ;; could be encoded in value.
   (context (type (list class)) (default ()))
   (read-only? (type bool) (default #f) (bit #t))
   (dict-params (type (list (tuple valdef (list (tuple class var))))))
   ))

;;; This is used only at the top level of a type during letrec type
;;; checking.

(define-struct recursive-type
  (include ntype)
  (predicate recursive-type?)
  (slots
   (type (type ntype))
   (placeholders (type (list exp)))))

;;; Gtypes are generalized types which can be copied quickly & stored in
;;; interfaces.  They may contain monomorphic type variables which will not
;;; be copied.

(define-struct gtype
  (include ntype)
  (predicate gtype?)
  (slots
   (context (type (list (list class))))
   (type (type ntype))))

;;; These tyvars just index a list of pre-allocated tyvars.

(define-struct gtyvar
  (include ntype)
  (predicate gtyvar?)
  (slots
   (varnum (type int))))

(define-struct const-type
  (include ntype)
  (predicate const-type?)
  (slots
   (type (type ntype))))