コード例 #1
0
ファイル: Interpreter.cs プロジェクト: takuto-h/omicron
 public Interpreter()
 {
     mTypeCtxt = new TypeCtxtGlobal();
     mTypeEnv = new TypeEnvGlobal();
     mValueCtxt = new ValueCtxtGlobal();
     mValueEnv = new ValueEnvGlobal();
 }
コード例 #2
0
ファイル: VEConst.cs プロジェクト: takuto-h/omicron
 public IType Check(
     ITypeCtxt typeCtxt,
     ITypeEnv typeEnv,
     IValueCtxt valueCtxt
 )
 {
     return mValueConst.ToType();
 }
コード例 #3
0
ファイル: VEType.cs プロジェクト: takuto-h/omicron
 public IType Check(
     ITypeCtxt typeCtxt,
     ITypeEnv typeEnv,
     IValueCtxt valueCtxt
 )
 {
     mTypeExpr.Check(typeCtxt);
     mTypeExpr.Eval(typeEnv);
     return TCUnit.Instance;
 }
コード例 #4
0
ファイル: VEApp.cs プロジェクト: takuto-h/omicron
 public IType Check(
     ITypeCtxt typeCtxt,
     ITypeEnv typeEnv,
     IValueCtxt valueCtxt
 )
 {
     IType type1 = mValueExpr1.Check(typeCtxt, typeEnv, valueCtxt);
     IType type2 = mValueExpr2.Check(typeCtxt, typeEnv, valueCtxt);
     return CheckApp(type1, type2);
 }
コード例 #5
0
ファイル: VEDef.cs プロジェクト: takuto-h/omicron
 public IType Check(
     ITypeCtxt typeCtxt,
     ITypeEnv typeEnv,
     IValueCtxt valueCtxt
 )
 {
     IType type = mValueExpr.Check(typeCtxt, typeEnv, valueCtxt);
     valueCtxt.Add(mValueVarName, type);
     return type;
 }
コード例 #6
0
ファイル: VETypeApp.cs プロジェクト: takuto-h/omicron
 public IType Check(
     ITypeCtxt typeCtxt,
     ITypeEnv typeEnv,
     IValueCtxt valueCtxt
 )
 {
     IType type1 = mValueExpr.Check(typeCtxt, typeEnv, valueCtxt);
     IKind kind = mTypeExpr.Check(typeCtxt);
     IType type2 = mTypeExpr.Eval(typeEnv);
     return CheckApp(type1, kind, type2);
 }
コード例 #7
0
ファイル: VETypeAbs.cs プロジェクト: takuto-h/omicron
 public IType Check(
     ITypeCtxt typeCtxt,
     ITypeEnv typeEnv,
     IValueCtxt valueCtxt
 )
 {
     Unique unique = new Unique();
     typeCtxt = typeCtxt.MakeChild();
     typeEnv = typeEnv.MakeChild();
     typeCtxt.Add(mTypeVarName, mKind);
     typeEnv.Add(mTypeVarName, new TVar(unique));
     IType type = mValueExpr.Check(typeCtxt, typeEnv, valueCtxt);
     return MakePolymorphicType(unique, mKind, type);
 }
コード例 #8
0
ファイル: VEVar.cs プロジェクト: takuto-h/omicron
 public IType Check(
     ITypeCtxt typeCtxt,
     ITypeEnv typeEnv,
     IValueCtxt valueCtxt
 )
 {
     IType result;
     if (!valueCtxt.TryGetValue(mValueVarName, out result))
     {
         throw new InvalidOperationException(
             string.Format("unknown variable: {0}", mValueVarName)
         );
     }
     return result;
 }
コード例 #9
0
ファイル: VEObj.cs プロジェクト: takuto-h/omicron
 public IType Check(
     ITypeCtxt typeCtxt,
     ITypeEnv typeEnv,
     IValueCtxt valueCtxt
 )
 {
     var methodTypes = new Dictionary<string, IType>();
     foreach (KeyValuePair<string, IValueExpr> kvp in mMethodValueExprs)
     {
         methodTypes.Add(
             kvp.Key, kvp.Value.Check(typeCtxt, typeEnv, valueCtxt)
         );
     }
     return new TObj(methodTypes);
 }
コード例 #10
0
ファイル: VERef.cs プロジェクト: takuto-h/omicron
 public IType Check(
     ITypeCtxt typeCtxt,
     ITypeEnv typeEnv,
     IValueCtxt valueCtxt
 )
 {
     IType type = mValueExpr.Check(typeCtxt, typeEnv, valueCtxt);
     if (!(type is TObj))
     {
         throw new InvalidOperationException(
             string.Format(
                 "{0} doesn't have an object type", mValueExpr.Show()
             )
         );
     }
     return ((TObj)type).GetMethodType(mMethodName);
 }
コード例 #11
0
ファイル: VEAbs.cs プロジェクト: takuto-h/omicron
 public IType Check(
     ITypeCtxt typeCtxt,
     ITypeEnv typeEnv,
     IValueCtxt valueCtxt
 )
 {
     IKind kind = mTypeExpr.Check(typeCtxt);
     if (!(kind is IKindConst))
     {
         throw new InvalidOperationException(
             string.Format(
                 "{0} doesn't have a base kind", mTypeExpr.Show()
             )
         );
     }
     IType type1 = mTypeExpr.Eval(typeEnv);
     valueCtxt = valueCtxt.MakeChild();
     valueCtxt.Add(mValueVarName, type1);
     IType type2 = mValueExpr.Check(typeCtxt, typeEnv, valueCtxt);
     return MakeFunctionType(type1, type2);
 }
コード例 #12
0
ファイル: VEUnfold.cs プロジェクト: takuto-h/omicron
 public IType Check(
     ITypeCtxt typeCtxt,
     ITypeEnv typeEnv,
     IValueCtxt valueCtxt
 )
 {
     mTypeExpr.Check(typeCtxt);
     IType rolledType = mTypeExpr.Eval(typeEnv);
     IType unrolledType = VEFold.Unroll(rolledType);
     IType valueExprType = mValueExpr.Check(
         typeCtxt, typeEnv, valueCtxt
     );
     if (!valueExprType.Equals(rolledType))
     {
         throw new InvalidOperationException(
             string.Format(
                 "{0} cannot be unfolded with the type {1}",
                 mValueExpr.Show(),
                 mTypeExpr.Show()
             )
         );
     }
     return unrolledType;
 }
コード例 #13
0
ファイル: ValueCtxtLocal.cs プロジェクト: takuto-h/omicron
 public ValueCtxtLocal(IValueCtxt parent)
 {
     mDictionary = new Dictionary<string, IType>();
     mParent = parent;
 }