public override bool IsSubtypeOf(CatKind k) { if (k.IsAny()) { return(true); } if (k is CatStackVar) { return(true); } if (!(k is CatTypeVector)) { return(false); } CatTypeVector v1 = this; CatTypeVector v2 = k as CatTypeVector; while (!v1.IsEmpty() && !v2.IsEmpty()) { CatKind t1 = v1.GetTop(); CatKind t2 = v2.GetTop(); if (!t1.IsSubtypeOf(t2)) { return(false); } v1 = v1.GetRest(); v2 = v2.GetRest(); } // v1 has to be at least as long to be a subtype if (v1.IsEmpty() && !v2.IsEmpty()) { return(false); } return(true); }
public override bool IsSubtypeOf(CatKind k) { if (k.IsAny() || k.IsDynFxn()) { return(IsRuntimePolymorphic()); } if (k is CatTypeVar) { return(true); } if (!(k is CatFxnType)) { return(false); } CatFxnType f = k as CatFxnType; bool ret = GetCons().IsSubtypeOf(f.GetCons()) && GetProd().IsSubtypeOf(f.GetProd()); if (HasSideEffects()) { ret = ret && f.HasSideEffects(); } return(ret); }