git.fiddlerwoaroof.com
Raw Blame History
;;; File: ast/definitions.scm   Author: John

;;; this file contains definitions for the named entities in the
;;; system.  These are used in both the front and back ends of the
;;; compiler.  These are created early in the compilation process
;;; (import/export) and filled in during compilation.  Binary interface
;;; files are just tables mapping names to definitions.

;;; All definitions have these fields for managing name spaces.  All
;;; names are uniquified; this requires adding `;' to the front of data
;;; constructors to separate them from type constructors.  Module names
;;; do not have a `definition' data structure - the `module' structure
;;; serves the same purpose.

;;; Definitions are found in two places: the symbol tables which are part of
;;; the module structure and the -ref nodes in the ast structure.  The -ref
;;; nodes have two fields: a name (from the parser) and a field which will
;;; point to the associated definition after name resolution.  Name resolution
;;; happens in a number of different places: top level definitions are
;;; resolved during import-export, type declarations are resolved during
;;; type declaration analysis, and everything else is resolved during scoping
;;; (alpha conversion).  The parser generates pre-resolved -ref nodes when
;;; parsing some constructs.  These refs denote pre-defined language
;;; constructs, such as lists, tuples, or prelude functions.

;;; A special set of definitions constitutes the `core' of Haskell.  These
;;; definitions are pre-allocated and are filled in during the compilation
;;; of the Prelude.  This allows the bootstrap of the system.


;;; All defs require name, unit, and module args to make.
;;; Other slots should all have appropriate defaults.

(define-struct def
  (slots
   ;; the uniquified name (from the definition)
   (name (type symbol))
   ;; compilation unit defined in
   (unit (type symbol))
   ;; name of the defining module
   (module (type symbol))
   ;; used by the closure check
   (exported? (type bool) (default '#f) (bit #t))
   ;; for symbols in `core' Haskell; special case for IO
   (core? (type bool) (default '#f) (bit #t))      
   ;; Always a core sym.  Used to avoid putting in sym table
   (prelude? (type bool) (default '#f) (bit #t))
   ))



;;; Variable information

(define-struct var
  (include def)
  (predicate var?)
  (slots
   ;; inferred during type inference
   (type             (type (maybe ntype))     (default '#f))
   ;; type affixed by sign-decl or class decl
   (signature        (type (maybe ntype))     (default '#f))
   (interface-type   (type (maybe ntype))     (default '#f))
   ;; most variables have no fixity information.
   (fixity           (type (maybe fixity))    (default '#f))
   ;; The following attributes are used by the backend
   (selector-fn?     (type bool)              (default '#f) (bit #t))
   (force-strict?    (type bool)              (default '#f) (bit #t))
   (force-inline?    (type bool)              (default '#f) (bit #t))
   (toplevel?        (type bool)              (default '#f) (bit #t))
   (simple?          (type bool)              (default '#f) (bit #t))
   (strict?          (type bool)              (default '#f) (bit #t))
   (optimized-refs?  (type bool)              (default '#f) (bit #t))
   (standard-refs?   (type bool)              (default '#f) (bit #t))
   (single-ref       (type (maybe int))       (default '#f))
   (arity            (type int)               (default 0))
   (referenced       (type int)               (default 0))
   (value            (type (maybe flic-exp))  (default '#f))
   (fullname         (type (maybe symbol))    (default '#f))
   (inline-value     (type (maybe flic-exp))  (default '#f))
   ;; Only function bindings use these slots
   (strictness       (type (list bool))       (default '()))
   (complexity       (type (maybe int))       (default '#f))
   (optimized-entry  (type (maybe symbol))    (default '#f))
   (annotations      (type (list annotation-value)) (default '()))
   (fn-referenced    (type int)               (default 0))
   (arg-invariant-value  (type (maybe flic-exp))  (default '#f))
   (arg-invariant?   (type bool)              (default '#f) (bit #t))
   ))
  

;;; This defines an individual class method

(define-struct method-var
  (include var)
  (predicate method-var?)
  (slots
   (class (type class) (uninitialized? #t))
   (default (type (maybe var)) (uninitialized? #t))
   (method-signature (type signature) (uninitialized? #t))))


;;; A data constructor

(define-struct con
  (include def)
  (predicate con?)
  (slots
   ;; These slots are initialized in the type declaration phase
   (arity (type int) (uninitialized? #t))
   (types (type (list type)) (uninitialized? #t))
   (slot-strict? (type (list bool)) (default '()))
   (tag (type int) (uninitialized? #t))
   (alg (type algdata) (uninitialized? #t))
   (infix? (type bool) (bit #t) (default '#f))
   (signature (type ntype) (uninitialized? #t))
   ;; Assigned during import-export phase
   (fixity (type (maybe fixity)) (default '#f))
   (lisp-fns (type t) (default '()))
   ))


;;; Definitions used by the type system.

(define-struct tycon-def
  (include def)
  (slots
   (arity (type integer) (default -1))))

(define-struct synonym
  (include tycon-def)
  (predicate synonym?)
  (slots
   ;; These slots are explicitly initialized in the type declaration phase.
   (args (type (list symbol)) (uninitialized? #t))
   (body (type type) (uninitialized? #t))  ; stored in ast form
   ))

(define-struct algdata
  (include tycon-def)
  (predicate algdata?)
  (slots
   ;; These slots are initialized explicitly in the type declaration phase
   ;; number of constructors
   (n-constr (type int) (uninitialized? #t)) 
   (constrs (type (list con)) (uninitialized? #t))
   (context (type (list context)) (uninitialized? #t))
   ;; arguments to tycon
   (tyvars (type (list symbol)) (uninitialized? #t))
   ;; signature for the type as a whole
   (signature (type (maybe ntype)) (default '#f))
   ;; classes this algdata is an instance of
   (classes (type (list class)) (uninitialized? #t))
   ;; true if all constructors have 0 arity
   (enum? (type bool) (bit #t) (uninitialized? #t))
   ;; true when only constructor
   (tuple? (type bool) (bit #t) (uninitialized? #t))
   ;; true for `tuple-syntax' tuples.
   (real-tuple? (type bool) (bit #t) (uninitialized? #t))
   ;; instances to derive
   (deriving (type (list class)) (uninitialized? #t))
   (export-to-lisp? (type bool) (default '#f) (bit #t))
   (implemented-by-lisp? (type bool) (default '#f) (bit #t))
   ))

(define-struct class
  (include def)
  (predicate class?)
  (slots
   ;; These slots are initialized in the import-export phase
   (method-vars (type (list method-var)) (uninitialized? #t))
   ;; These slots are explicitly initialized in the type declaration phase
   ;; immediate superclasses
   (super (type (list class)) (uninitialized? #t))
   ;; all superclasses
   (super* (type (list class)) (uninitialized? #t))
   ;; name of class type variable
   (tyvar (type symbol) (uninitialized? #t))
   (instances (type (list instance)) (uninitialized? #t))
   (kind (type (enum standard numeric other)) (uninitialized? #t))
   (n-methods (type int) (uninitialized? #t))
   (dict-size (type int) (uninitialized? #t))
   (selectors (type (list (tuple method-var var))) (uninitialized? #t))
   ))

;;; Since instances are not named there is no need to include def.  

(define-struct instance
  (include ast-node)
  (slots
   ;; These slots always have initializers supplied with MAKE.
   (algdata (type algdata))
   (tyvars (type (list symbol)))
   (class (type class))
   (context (type (list context)))
   (gcontext (type (list (list class))))
   (dictionary (type var))

   ;; Explicitly initialized during the type declaration phase.
   (methods (type (list (tuple method-var var))) (uninitialized? #t))

   ;; These slots usually default on creation.
   (decls (type (list decl)) (default '()))
   ;; used during verification of derived instances
   (ok? (type bool) (bit #t) (default #f))
   ;; marks magically generated tuple instances
   (special? (type bool) (bit #t) (default #f))
   (suppress-readers? (type bool) (bit #t) (default #f))
   ))