(* meta-var.sml * * COPYRIGHT (c) 2010 The Diderot Project (http://diderot.cs.uchicago.edu) * All rights reserved. * * The Diderot typechecker uses four kinds of meta variables: * * type variables * differentiation variables * shape variables * dimension variables *) structure MetaVar = struct datatype ty_var = datatype Types.ty_var datatype diff_var = datatype Types.diff_var datatype shape_var = datatype Types.shape_var datatype dim_var = datatype Types.dim_var datatype kind = datatype Types.kind (***** Type variables ****) fun newTyVar () = TV{ id = Stamp.new(), bind = ref NONE } fun tyVarToString (TV{id, ...}) = "'ty" ^ Stamp.toString id (***** Differentiation variables ****) fun newDiffVar () = DfV{ id = Stamp.new(), bound = ref 0, bind = ref NONE } fun diffVarToString (DfV{id, ...}) = "'diff" ^ Stamp.toString id (***** Shape variables ****) fun newShapeVar () = SV{ id = Stamp.new(), bind = ref NONE } fun shapeVarToString (SV{id, ...}) = "'shp" ^ Stamp.toString id (***** Dimension variables ****) fun newDimVar () = DV{ id = Stamp.new(), bind = ref NONE } fun dimVarToString (DV{id, ...}) = "'dim" ^ Stamp.toString id (***** Meta variables ****) fun metaToString (TYPE tv) = tyVarToString tv | metaToString (DIFF dv) = diffVarToString dv | metaToString (SHAPE sv) = shapeVarToString sv | metaToString (DIM dv) = dimVarToString dv end