Get rid of extra runtime type checks
This commit is contained in:
parent
93215cd294
commit
8619f67b91
@ -63,16 +63,6 @@ public class Env
|
|||||||
|
|
||||||
public class Interpreter : AST.IExprVisitor<Env, object>
|
public class Interpreter : AST.IExprVisitor<Env, object>
|
||||||
{
|
{
|
||||||
private static void checkTypesEqual(object a, object b)
|
|
||||||
{
|
|
||||||
var aType = a.GetType();
|
|
||||||
var bType = b.GetType();
|
|
||||||
if (aType != bType)
|
|
||||||
{
|
|
||||||
throw new Exception("Type mismatch: {aType} != {bType}.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class PatternMismatchException : Exception
|
private class PatternMismatchException : Exception
|
||||||
{
|
{
|
||||||
public readonly Token Start;
|
public readonly Token Start;
|
||||||
@ -203,7 +193,6 @@ public class Interpreter : AST.IExprVisitor<Env, object>
|
|||||||
{
|
{
|
||||||
throw new ArgumentException($"no such field: {name}");
|
throw new ArgumentException($"no such field: {name}");
|
||||||
}
|
}
|
||||||
checkTypesEqual(value, values.Peek());
|
|
||||||
return new Record { Fields = Fields.SetItem(name, values!.Pop().Push(value)) };
|
return new Record { Fields = Fields.SetItem(name, values!.Pop().Push(value)) };
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -470,13 +459,7 @@ public class Interpreter : AST.IExprVisitor<Env, object>
|
|||||||
List l = List.Empty;
|
List l = List.Empty;
|
||||||
foreach (var itemExpr in expr.Elements)
|
foreach (var itemExpr in expr.Elements)
|
||||||
{
|
{
|
||||||
var item = evaluate(env, itemExpr);
|
l = l.Add(evaluate(env, itemExpr));
|
||||||
if (!l.IsEmpty)
|
|
||||||
{
|
|
||||||
try { checkTypesEqual(l[0], item); }
|
|
||||||
catch { throw new RuntimeError(itemExpr.Start, "List items must all have same type."); }
|
|
||||||
}
|
|
||||||
l = l.Add(item);
|
|
||||||
}
|
}
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user