diff --git a/Upsilon/BaseTypes/Number/Number.cs b/Upsilon/BaseTypes/Number/Number.cs index 634e589..fc92c45 100644 --- a/Upsilon/BaseTypes/Number/Number.cs +++ b/Upsilon/BaseTypes/Number/Number.cs @@ -82,5 +82,18 @@ namespace Upsilon.BaseTypes.Number #endregion + public static explicit operator double(Number n) + { + if (n.IsFloat) + return ((NumberDouble) n); + return ((NumberLong) n).Value; + } + + public static explicit operator long(Number n) + { + if (n.IsFloat) + return (long)((NumberDouble) n).Value; + return ((NumberLong) n).Value; + } } } \ No newline at end of file diff --git a/Upsilon/Evaluator/EvaluationScope.cs b/Upsilon/Evaluator/EvaluationScope.cs index 7cf4341..f49f391 100644 --- a/Upsilon/Evaluator/EvaluationScope.cs +++ b/Upsilon/Evaluator/EvaluationScope.cs @@ -51,5 +51,22 @@ namespace Upsilon.Evaluator return true; return false; } + + public bool TryGet(string variable, out LuaType obj) + { + foreach (var luaType in _variables) + { + if (luaType.Key.Name == variable) + { + obj = luaType.Value; + return true; + }; + } + if (_parentScope != null) + if (_parentScope.TryGet(variable, out obj)) + return true; + obj = null; + return false; + } } } \ No newline at end of file diff --git a/Upsilon/Evaluator/Evaluator.cs b/Upsilon/Evaluator/Evaluator.cs index c9d52ba..87deb75 100644 --- a/Upsilon/Evaluator/Evaluator.cs +++ b/Upsilon/Evaluator/Evaluator.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using Upsilon.BaseTypes; using Upsilon.BaseTypes.Number; using Upsilon.Binder; @@ -12,13 +11,7 @@ namespace Upsilon.Evaluator private LuaType _value; private readonly EvaluationScope _scope; - public Evaluator(Diagnostics diagnostics, Dictionary vars) - { - _diagnostics = diagnostics; - _scope = new EvaluationScope(vars); - } - - private Evaluator(Diagnostics diagnostics, EvaluationScope parentScope) + internal Evaluator(Diagnostics diagnostics, EvaluationScope parentScope) { _diagnostics = diagnostics; _scope = new EvaluationScope(parentScope); diff --git a/Upsilon/Evaluator/Script.cs b/Upsilon/Evaluator/Script.cs index 9aa730e..a75c711 100644 --- a/Upsilon/Evaluator/Script.cs +++ b/Upsilon/Evaluator/Script.cs @@ -13,6 +13,7 @@ namespace Upsilon.Evaluator private readonly BlockStatementSyntax _parsed; public Diagnostics Diagnostics { get; } private Binder.Binder Binder { get; } + public EvaluationScope Scope { get; } public Script(string scriptString, Dictionary variables = null) { @@ -22,7 +23,8 @@ namespace Upsilon.Evaluator if (variables == null) variables = new Dictionary(); Binder = new Binder.Binder(new BoundScope(variables, null), Diagnostics); - Evaluator = new Evaluator( Diagnostics, variables); + Scope = new EvaluationScope(variables); + Evaluator = new Evaluator( Diagnostics, Scope); } public BoundScript Bind() diff --git a/UpsilonTests/BasicMathExpressions.cs b/UpsilonTests/BasicMathExpressions.cs index 604e0d9..9adcb9c 100644 --- a/UpsilonTests/BasicMathExpressions.cs +++ b/UpsilonTests/BasicMathExpressions.cs @@ -17,8 +17,8 @@ namespace UpsilonTests [InlineData("0.005 + 2.2", 2.205)] public void Addition(string input, double expectedOutput) { - var actual = new Script(input).Evaluate(); - Assert.Equal(expectedOutput, actual, 8); + var actual = new Script(input).Evaluate(); + Assert.Equal(expectedOutput, (double)actual, 8); } [Theory] @@ -30,8 +30,8 @@ namespace UpsilonTests [InlineData("10.256-2.8546", 7.4014)] public void Subtraction(string input, double expectedOutput) { - var actual = new Script(input).Evaluate(); - Assert.Equal(expectedOutput, actual, 8); + var actual = new Script(input).Evaluate(); + Assert.Equal(expectedOutput, (double)actual, 8); } [Theory] @@ -40,18 +40,19 @@ namespace UpsilonTests [InlineData("21312 * 41684", 888369408)] public void Multiplication(string input, double expectedOutput) { - var actual = new Script(input).Evaluate(); - Assert.Equal(expectedOutput, actual, 8); + var actual = new Script(input).Evaluate(); + Assert.Equal(expectedOutput, (double)actual, 8); } [Theory] [InlineData("1/1", 1)] [InlineData("1000 / 10", 100)] - [InlineData("656486 / 5146", 127.57209483)] + [InlineData("656486 / 5146", 127)] + [InlineData("656486 / 5146.0", 127.57209483)] public void Divison(string input, double expectedOutput) { - var actual = new Script(input).Evaluate(); - Assert.Equal(expectedOutput, actual, 8); + var actual = new Script(input).Evaluate(); + Assert.Equal(expectedOutput, (double)actual, 8); } } diff --git a/UpsilonTests/MathPrecedence.cs b/UpsilonTests/MathPrecedence.cs index d13c10b..a768cbd 100644 --- a/UpsilonTests/MathPrecedence.cs +++ b/UpsilonTests/MathPrecedence.cs @@ -12,7 +12,7 @@ namespace UpsilonTests [InlineData("(10 + 5) * 5", 75)] public void Parenthesis(string input, double expectedOutput) { - var actual = new Script(input).Evaluate(); + var actual = new Script(input).Evaluate(); Assert.Equal(expectedOutput, actual, 8); } @@ -21,7 +21,7 @@ namespace UpsilonTests [InlineData("5 + 10 * 5", 55)] public void MultiplicationBeforeAddition(string input, double expectedOutput) { - var actual = new Script(input).Evaluate(); + var actual = new Script(input).Evaluate(); Assert.Equal(expectedOutput, actual, 8); } diff --git a/UpsilonTests/ScopeTests.cs b/UpsilonTests/ScopeTests.cs index 963d213..355ea8c 100644 --- a/UpsilonTests/ScopeTests.cs +++ b/UpsilonTests/ScopeTests.cs @@ -14,13 +14,13 @@ a = 10 if true then local a = 100 end -b = a "; var script = new Script(input); Assert.Empty(script.Diagnostics.Messages); - var evaluate = script.Evaluate(); + script.Evaluate(); Assert.Empty(script.Diagnostics.Messages); - Assert.Equal((long)10, evaluate); + Assert.True(script.Scope.TryGet("a", out var obj)); + Assert.Equal((long)10, (NumberLong)obj); } [Fact] @@ -35,9 +35,10 @@ b = a "; var script = new Script(input); Assert.Empty(script.Diagnostics.Messages); - var evaluate = script.Evaluate(); + script.Evaluate(); Assert.Empty(script.Diagnostics.Messages); - Assert.Equal((long)100, evaluate); + Assert.True(script.Scope.TryGet("a", out var obj)); + Assert.Equal((long)100, (NumberLong)obj); } }