protected override Expression GetBody( Dictionary <INode, string> symbols, Dictionary <INode, List <INode> > letEntries, HashSet <string> initializedIds, HashSet <string> conditionalIds) { var uninitialized = new HashSet <INode>(); NodeUtils.GatherUninitializedIds(EntryPoint, symbols, letEntries, initializedIds, uninitialized); var initialized = new List <Expression>(); foreach (var node in uninitialized) { var symbol = symbols[node]; if (!initializedIds.Contains(symbol)) { symbols.Remove(node); var binding = node.compile(symbols, letEntries, initializedIds, conditionalIds); symbols[node] = symbol; initialized.Add(Expression.NewSetId(symbol, binding)); initializedIds.Add(symbol); } } initialized.Add(Utils.MakeAnon( Inputs, EntryPoint.compile(symbols, letEntries, initializedIds, conditionalIds))); return(Expression.NewBegin(Utils.SequenceToFSharpList(initialized))); }
private Expression __compileBody( Dictionary <INode, string> symbols, Dictionary <INode, List <INode> > letEntries, HashSet <string> initializedIds, HashSet <string> conditionalIds) { string symbol; if (symbols.TryGetValue(this, out symbol)) { var body = Expression.NewId(symbol); if (conditionalIds.Contains(symbol)) { symbols.Remove(this); var binding = compile(symbols, letEntries, initializedIds, conditionalIds); symbols[this] = symbol; body = Expression.NewIf( Expression.NewId(symbol + "-init"), body, Expression.NewBegin( Utils.MakeFSharpList( Expression.NewSetId(symbol, binding), Expression.NewSetId(symbol + "-init", Expression.NewNumber_E(1)), body))); } else if (!initializedIds.Contains(symbol)) { symbols.Remove(this); var binding = compile(symbols, letEntries, initializedIds, conditionalIds); symbols[this] = symbol; body = Expression.NewBegin( Utils.MakeFSharpList( Expression.NewSetId(symbol, binding), Expression.NewSetId(symbol + "-init", Expression.NewNumber_E(1)), body)); initializedIds.Add(symbol); } return(body); } else { return(compileBody(symbols, letEntries, initializedIds, conditionalIds)); } }