/// <summary> /// Prepares the PowerCalls (Call and Dict) for using in a Script /// </summary> /// <param name="variables">the variables that are being prepared</param> /// <param name="prepareVariables">an action that is used to prepare a new scope for special methodcalls</param> /// <param name="visitor">A visitor instance that is executing the current script and contains the required root variables for child-scripts</param> public void PreparePowerCalls(IDictionary <string, object> variables, InitializeScopeVariables prepareVariables, ScriptVisitor visitor) { variables["Dict"] = new Func <object[], object[], Dictionary <string, object> >((a, b) => Dict(a, b)); variables["Call"] = new Func <string, IDictionary <string, object>, object>((a, b) => CallScript(a, b, prepareVariables, visitor.CopyInitial())); }
/// <summary> /// Parses one single Expression-Block /// </summary> /// <param name="expression">the target expression to execute</param> /// <param name="implicitContext">implicit context that is used for the interpreter-session that is used for the codeblock</param> /// <param name="scopeInitializer">an initializer that can be used to provide special methods and values to the initial scope</param> /// <returns>the evaluation result</returns> public static object ParseBlock(string expression, object implicitContext, InitializeScopeVariables scopeInitializer = null) { ScriptVisitor visitor; using (var session = InterpreterBuffer.GetReplInstance(implicitContext, scopeInitializer, out visitor)) { return(ParseBlock(expression, session)); } }
/// <summary> /// Gets an existing free repl session or creates a new one if required /// </summary> /// <param name="baseValues">the base values used to initialize the repl - session</param> /// <param name="scopeInitializer">a callback that is used to prepare the scope variables for the scripting</param> /// <param name="visitorInstance">the visitor instance that is capable to process expressions and scripts</param> /// <returns>a runner item that can be used to control the repl session</returns> public static IDisposable GetReplInstance(object implicitContext, InitializeScopeVariables scopeInitializer, out ScriptVisitor visitorInstance) { Scope s = new Scope(new Dictionary <string, object> { { "$data", implicitContext } }); s.ImplicitContext = "$data"; return(GetReplInstance(s, scopeInitializer, out visitorInstance)); }
/// <summary> /// Excecutes a Script /// </summary> /// <param name="variables">the initial variables for the script</param> /// <param name="prepareVariables">a callback that will be used in order to initialize lazy-evaluation variable values</param> /// <returns>the return value that was generated by the script</returns> public TOutput Execute(IDictionary <string, object> variables, InitializeScopeVariables prepareVariables) { ScriptVisitor visitor; InitializeScopeVariables dff = prepareVariables ?? (a => { DefaultCallbacks.PrepareDefaultCallbacks(a.Scope, a.ReplSession); }); InitializeScopeVariables newInitializer = args => { PreparePowerCalls(args.Scope, prepareVariables, args.Visitor); dff(args); }; using (var session = InterpreterBuffer.GetReplInstance(variables, newInitializer, out visitor)) { // todo: reactivate return(Execute(session)); } }
/// <summary> /// Gets an existing free repl session or creates a new one if required /// </summary> /// <param name="baseValues">the base values used to initialize the repl - session</param> /// <param name="scopeInitializer">a callback that is used to prepare the scope variables for the scripting</param> /// <param name="visitorInstance">the visitor instance that is capable to process expressions and scripts</param> /// <returns>a runner item that can be used to control the repl session</returns> public static IDisposable GetReplInstance(IDictionary <string, object> baseValues, InitializeScopeVariables scopeInitializer, out ScriptVisitor visitorInstance) { bool simpleInit = (baseValues is Scope); lock (runners) { RunnerItem retVal = runners.FirstOrDefault(n => !simpleInit && n.Lock()); if (retVal == null) { ScriptVisitor visitor = simpleInit ? new ScriptVisitor((Scope)baseValues) : new ScriptVisitor(); retVal = new RunnerItem(visitor, simpleInit); retVal.Lock(); if (visitor.Reactivateable) { runners.Add(retVal); } } visitorInstance = (ScriptVisitor)retVal.Visitor; if (!simpleInit) { visitorInstance.ClearScope(baseValues); } InitializeScopeVariables dff = scopeInitializer ?? (a => { DefaultCallbacks.PrepareDefaultCallbacks(a.Scope, a.ReplSession); }); visitorInstance.Prepare(dff); return(retVal); } }
/// <summary> /// Parses one single Expression /// </summary> /// <param name="expression">the target expression to execute</param> /// <param name="variables">the initial variables that are provided to the expression</param> /// <param name="scopeInitializer">an initializer that can be used to provide special methods and values to the initial scope</param> /// <returns>the evaluation result</returns> public static object Parse(string expression, IDictionary <string, object> variables, InitializeScopeVariables scopeInitializer = null) { ScriptVisitor visitor; using (var session = InterpreterBuffer.GetReplInstance(variables, scopeInitializer, out visitor)) { return(Parse(expression, session)); } }
/// <summary> /// Begins a repl - session /// </summary> /// <param name="baseValues">the base values that are used for the current session</param> /// <param name="scopePreparer">a callback that is used to prepare the repl session variables</param> /// <returns>a value that can be used to end this repl - session</returns> public static IDisposable BeginRepl(IDictionary <string, object> baseValues, InitializeScopeVariables scopePreparer) { ScriptVisitor visitor; return(InterpreterBuffer.GetReplInstance(baseValues, scopePreparer, out visitor)); }
/// <summary> /// Calls a Script inside a script /// </summary> /// <param name="scriptFile">the script file</param> /// <param name="initialVariables">the initial variables</param> /// <param name="prepareVariables">a value preparer for root values</param> /// <param name="baseValues">the initial values that are contained in the root-script</param> /// <returns>the value of the script</returns> private static object CallScript(string scriptFile, IDictionary <string, object> initialVariables, InitializeScopeVariables prepareVariables, IDictionary <string, object> baseValues) { bool dontClear = initialVariables is IScope; IDictionary <string, object> construct = (initialVariables is IScope) ? initialVariables : new Dictionary <string, object>(initialVariables); try { foreach (KeyValuePair <string, object> tmp in baseValues) { if (!construct.ContainsKey(tmp.Key)) { construct[tmp.Key] = tmp.Value; } } ScriptFile <object> file = ScriptFile <object> .FromFile(scriptFile); return(file.Execute(construct, prepareVariables)); } finally { if (!dontClear) { construct.Clear(); } } }