Beispiel #1
0
        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)));
        }
Beispiel #2
0
        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));
            }
        }