Better handling of Static Scope
This commit is contained in:
parent
95f76bc5e3
commit
d6e18d9b0c
|
@ -4,6 +4,7 @@ using System.Collections.Immutable;
|
||||||
using Upsilon.BaseTypes;
|
using Upsilon.BaseTypes;
|
||||||
using Upsilon.Binder;
|
using Upsilon.Binder;
|
||||||
using Upsilon.Parser;
|
using Upsilon.Parser;
|
||||||
|
using Upsilon.StandardLibraries;
|
||||||
using Upsilon.Text;
|
using Upsilon.Text;
|
||||||
using Upsilon.Utilities;
|
using Upsilon.Utilities;
|
||||||
|
|
||||||
|
@ -19,15 +20,18 @@ namespace Upsilon.Evaluator
|
||||||
private Binder.Binder Binder { get; }
|
private Binder.Binder Binder { get; }
|
||||||
private EvaluationScope Scope { get; }
|
private EvaluationScope Scope { get; }
|
||||||
|
|
||||||
public Script(string scriptString, BoundScope boundStaticScope, EvaluationScope staticScope )
|
public Script(string scriptString, BoundScope overrideBoundStaticScope = null,
|
||||||
|
EvaluationScope overrideStaticScope = null )
|
||||||
{
|
{
|
||||||
ScriptString = new SourceText(scriptString);
|
ScriptString = new SourceText(scriptString);
|
||||||
Diagnostics = new Diagnostics(ScriptString);
|
Diagnostics = new Diagnostics(ScriptString);
|
||||||
_parsed = Parser.Parser.Parse(scriptString, Diagnostics);
|
_parsed = Parser.Parser.Parse(scriptString, Diagnostics);
|
||||||
|
|
||||||
var boundScope = BoundScope.WithReadOnlyScope(boundStaticScope);
|
var staticBoundScope = overrideBoundStaticScope ?? StaticScope.BoundScope;
|
||||||
|
var boundScope = BoundScope.WithReadOnlyScope(staticBoundScope);
|
||||||
Binder = Upsilon.Binder.Binder.CreateWithSetScope(Diagnostics, boundScope);
|
Binder = Upsilon.Binder.Binder.CreateWithSetScope(Diagnostics, boundScope);
|
||||||
|
|
||||||
|
var staticScope = overrideStaticScope ?? StaticScope.Scope;
|
||||||
Scope = EvaluationScope.CreateWithGetOnlyParent(staticScope);
|
Scope = EvaluationScope.CreateWithGetOnlyParent(staticScope);
|
||||||
Evaluator = Evaluator.CreateWithSetScope(Diagnostics, Scope);
|
Evaluator = Evaluator.CreateWithSetScope(Diagnostics, Scope);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
using System.Collections.Immutable;
|
|
||||||
using System.Linq;
|
|
||||||
using Upsilon.BaseTypes;
|
|
||||||
using Upsilon.Binder;
|
|
||||||
using Upsilon.Evaluator;
|
|
||||||
|
|
||||||
namespace Upsilon.StandardLibraries
|
|
||||||
{
|
|
||||||
public class StandardLibrary
|
|
||||||
{
|
|
||||||
public static (EvaluationScope, BoundScope) Create()
|
|
||||||
{
|
|
||||||
var basicFunctions = new BasicFunctions().LoadMethods();
|
|
||||||
var scope = new EvaluationScope(basicFunctions.ToDictionary(x => x.Key, x => (LuaType)x.Value));
|
|
||||||
var boundScope =
|
|
||||||
new BoundScope(
|
|
||||||
scope.Variables.ToDictionary(x => x.Key
|
|
||||||
, x => (VariableSymbol)new FunctionVariableSymbol(x.Key, x.Value.Type, false, ImmutableArray<VariableSymbol>.Empty){IsBound = true}),
|
|
||||||
null);
|
|
||||||
return (scope, boundScope);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
using System.Collections.Immutable;
|
||||||
|
using System.Linq;
|
||||||
|
using Upsilon.BaseTypes;
|
||||||
|
using Upsilon.Binder;
|
||||||
|
using Upsilon.Evaluator;
|
||||||
|
|
||||||
|
namespace Upsilon.StandardLibraries
|
||||||
|
{
|
||||||
|
public static class StaticScope
|
||||||
|
{
|
||||||
|
private static EvaluationScope _staticScope;
|
||||||
|
private static BoundScope _staticBoundScope;
|
||||||
|
|
||||||
|
public static EvaluationScope Scope
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_staticScope != null)
|
||||||
|
return _staticScope;
|
||||||
|
|
||||||
|
var (evaluationScope, boundScope) = CreateStandardLibrary();
|
||||||
|
_staticScope = evaluationScope;
|
||||||
|
_staticBoundScope = boundScope;
|
||||||
|
return _staticScope;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BoundScope BoundScope
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_staticBoundScope != null)
|
||||||
|
return _staticBoundScope;
|
||||||
|
|
||||||
|
var (evaluationScope, boundScope) = CreateStandardLibrary();
|
||||||
|
_staticScope = evaluationScope;
|
||||||
|
_staticBoundScope = boundScope;
|
||||||
|
return _staticBoundScope;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static (EvaluationScope, BoundScope) CreateStandardLibrary()
|
||||||
|
{
|
||||||
|
var basicFunctions = new BasicFunctions().LoadMethods();
|
||||||
|
var scope = new EvaluationScope(basicFunctions.ToDictionary(x => x.Key, x => (LuaType)x.Value));
|
||||||
|
var boundScope =
|
||||||
|
new BoundScope(
|
||||||
|
scope.Variables.ToDictionary(x => x.Key
|
||||||
|
, x => (VariableSymbol)new FunctionVariableSymbol(x.Key, x.Value.Type, false, ImmutableArray<VariableSymbol>.Empty){IsBound = true}),
|
||||||
|
null);
|
||||||
|
return (scope, boundScope);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RegisterStaticVariable(string name, object value)
|
||||||
|
{
|
||||||
|
var luaVariable = value.ToLuaType();
|
||||||
|
var varSymbol = new VariableSymbol(name, luaVariable.Type, false);
|
||||||
|
BoundScope.SetVariable(varSymbol);
|
||||||
|
Scope.Set(varSymbol, luaVariable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -33,7 +33,7 @@ namespace UpsilonTests
|
||||||
|
|
||||||
public StaticScriptFixture()
|
public StaticScriptFixture()
|
||||||
{
|
{
|
||||||
var (evaluationScope, boundScope) = StandardLibrary.Create();
|
var (evaluationScope, boundScope) = Upsilon.StandardLibraries.StaticScope.CreateStandardLibrary();
|
||||||
StaticScope = evaluationScope;
|
StaticScope = evaluationScope;
|
||||||
BoundScope = boundScope;
|
BoundScope = boundScope;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Upsilon;
|
using Upsilon;
|
||||||
using Upsilon.Evaluator;
|
using Upsilon.Evaluator;
|
||||||
|
@ -14,7 +13,7 @@ namespace Ycicle
|
||||||
{
|
{
|
||||||
Console.WriteLine("Upsilon REPL");
|
Console.WriteLine("Upsilon REPL");
|
||||||
Script script = null;
|
Script script = null;
|
||||||
var (evaluationScope, boundScope) = StandardLibrary.Create();
|
var (evaluationScope, boundScope) = StaticScope.CreateStandardLibrary();
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
@ -101,7 +100,7 @@ namespace Ycicle
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sb.Append(o.ToString());
|
sb.Append(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
|
|
Loading…
Reference in New Issue