Ejemplo n.º 1
0
        private void From(Exp variable, CodeExpression collection, List <CodeQueryClause> queryClauses)
        {
            switch (variable)
            {
            case Identifier id:
            {
                var f = m.From(id.Accept(this), collection);
                queryClauses.Add(f);
                break;
            }

            case ExpList expList:
            {
                var vars = expList.Expressions.Select(v => v.Accept(this)).ToArray();
                var type = MakeTupleType(expList.Expressions);
                var it   = gensym.GenSymAutomatic("_tup_", type, false);
                var f    = m.From(it, m.ApplyMethod(collection, "Chop",
                                                    m.Lambda(vars,
                                                             MakeTupleCreate(vars))));
                queryClauses.Add(f);
                for (int i = 0; i < vars.Length; ++i)
                {
                    var l = m.Let(vars[i], m.Access(it, $"Item{i + 1}"));
                    queryClauses.Add(l);
                }
                break;
            }

            case PyTuple tuple:
            {
                var vars = tuple.values.Select(v => v.Accept(this)).ToArray();
                var type = MakeTupleType(tuple.values);
                var it   = gensym.GenSymAutomatic("_tup_", type, false);
                var f    = m.From(it, m.ApplyMethod(collection, "Chop",
                                                    m.Lambda(vars,
                                                             MakeTupleCreate(vars))));
                queryClauses.Add(f);
                for (int i = 0; i < vars.Length; ++i)
                {
                    var l = m.Let(vars[i], m.Access(it, $"Item{i + 1}"));
                    queryClauses.Add(l);
                }
                break;
            }

            default:
                throw new NotImplementedException(variable.GetType().Name);
            }
        }
Ejemplo n.º 2
0
 public CodeVariableReferenceExpression GenSymParameter(string prefix, CodeTypeReference type)
 {
     return(gensym.GenSymAutomatic(prefix, type, true));
 }
Ejemplo n.º 3
0
        public CodeExpression VisitDictComprehension(DictComprehension dc)
        {
            //{ k:copy.copy(v) for k, v in path.info.iteritems() }
            //string sExp = "path.info.iteritems.ToDictionary(k => k, v => copy.copy(v))";

            var list = dc.source.collection.Accept(this);

            switch (dc.source.variable)
            {
            case ExpList varList:
            {
                //if (varList.Expressions.Count != 2)
                //    throw new InvalidOperationException("Variable list should contain one or two variables.");
                var args = varList.Expressions.Select((e, i) => Tuple.Create(e, string.Format($"Item{i + 1}")))
                           .ToDictionary(d => d.Item1, d => d.Item2);
                var tpl = gensym.GenSymAutomatic("_tup_", null, false);

                gensym.PushIdMappings(varList.Expressions.ToDictionary(e => e.ToString(), e => m.Access(tpl, args[e])));

                var kValue = dc.key.Accept(this);
                var vValue = dc.value.Accept(this);

                gensym.PopIdMappings();

                return(m.Appl(
                           m.MethodRef(list, "ToDictionary"),
                           m.Lambda(new CodeExpression[] { tpl }, kValue),
                           m.Lambda(new CodeExpression[] { tpl }, vValue)));
            }

            case Identifier id:
            {
                var kValue = dc.key.Accept(this);
                var vValue = dc.value.Accept(this);
                return(m.Appl(
                           m.MethodRef(list, "ToDictionary"),
                           m.Lambda(new CodeExpression[] { id.Accept(this) }, kValue),
                           m.Lambda(new CodeExpression[] { id.Accept(this) }, vValue)));
            }

            case PyTuple tuple:
            {
                if (tuple.values.Count != 2)
                {
                    //TODO: tuples, especially nested tuples, are hard.
                    return(m.Prim("!!!{" +
                                  dc.key.Accept(this) +
                                  ": " +
                                  dc.value.Accept(this)));
                }

                var enumvar = gensym.GenSymAutomatic("_de", null, false);
                gensym.PushIdMappings(new Dictionary <string, CodeExpression>
                    {
                        { tuple.values[0].ToString(), m.Access(enumvar, "Key") },
                        { tuple.values[1].ToString(), m.Access(enumvar, "Value") },
                    });

                var kValue = dc.key.Accept(this);
                var vValue = dc.value.Accept(this);

                gensym.PopIdMappings();

                return(m.Appl(
                           m.MethodRef(list, "ToDictionary"),
                           m.Lambda(new CodeExpression[] { enumvar }, kValue),
                           m.Lambda(new CodeExpression[] { enumvar }, vValue)));
            }
            }
            throw new NotImplementedException();
        }