protected internal override ProcedureCallNode Compile(IEnumerable<string> portNames) { ExternMacro m = new ExternMacro( delegate(FSharpList<Expression> args, ExecutionEnvironment environment) { if (this.Bench.RunCancelled) throw new CancelEvaluationException(false); IdlePromiseDelegate<Expression> eval = delegate { this.Bench.InIdleThread = true; dynElementSettings.SharedInstance.Bench.InitTransaction(); try { var exp = environment.Evaluate(args[0]); UpdateLayoutDelegate uld = new UpdateLayoutDelegate(CallUpdateLayout); Dispatcher.Invoke(uld, System.Windows.Threading.DispatcherPriority.Background, new object[] { this }); dynElementSettings.SharedInstance.Bench.EndTransaction(); this.ValidateConnections(); return exp; } catch (CancelEvaluationException ex) { throw ex; } catch (Exception ex) { this.Dispatcher.Invoke(new Action( delegate { Debug.WriteLine(ex.Message + " : " + ex.StackTrace); this.Bench.Log(ex); this.Bench.ShowElement(this); dynElementSettings.SharedInstance.Writer.WriteLine(ex.Message); dynElementSettings.SharedInstance.Writer.WriteLine(ex.StackTrace); } )); this.Error(ex.Message); return null; } }; if (dynElementSettings.SharedInstance.Bench.RunInDebug) { var val = environment.Evaluate(args[0]); this._isDirty = false; return val; } var result = IdlePromise<Expression>.ExecuteOnIdle(eval); this.Bench.InIdleThread = false; return result; } ); return new ExternalMacroNode(m, portNames); }
public ExternalMacroNode(ExternMacro m) : this(m, new List<string>()) { }
public static Expression MakeMacro(ExternMacro macro) { //return Expression.NewSpecial( // FuncConvert.ToFSharpFunc( // delegate(FSharpFunc<Expression, Expression> c) // { // return FuncConvert.ToFSharpFunc( // delegate(FSharpList<FSharpRef<FSharpMap<string, FSharpRef<Expression>>>> env) // { // return FuncConvert.ToFSharpFunc( // delegate(FSharpList<Expression> args) // { // return c.Invoke(macro(args, env)); // } // ); // } // ); // } // ) //); return FScheme.makeExternMacro(new FScheme.ExternMacro( delegate(FSharpList<Expression> args, FSharpRef<FSharpMap<string, FSharpRef<Expression>>> env) { return macro(args, new ExecutionEnvironment(env)); } )); }
public ExternalMacroNode(ExternMacro m, IEnumerable<string> inputList) : base(inputList) { this.EntryPoint = m; }