Пример #1
0
        public static bool IsList(this ISExpression sexpr)
        {
            var c = sexpr as Cons;

            return(sexpr.IsNil() ||
                   (c != null && (c.Cdr.IsNil() || c.Cdr.IsList())));
        }
Пример #2
0
 protected static void CheckNotIllegalSymbol(ISExpression expr)
 {
     if (CompilerConstants.IllegalVariables.Contains(expr))
     {
         throw new SchemeCompilerException("compiler", "name cannot be used as a variable", expr.ToString());
     }
 }
Пример #3
0
        public static ISExpression[] Parse(string input)
        {
            AntlrInputStream  inputStream       = new AntlrInputStream(input);
            SchemeLexer       lexer             = new SchemeLexer(inputStream);
            CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
            SchemeParser      parser            = new SchemeParser(commonTokenStream);

            var context = parser.body();
            var visitor = new SchemeVisitor();
            var expr    = visitor.Visit(context);

            ISExpression[] arr;
            if (expr is ISExpression)
            {
                arr = new ISExpression[] { (ISExpression)expr }
            }
            ;
            else if (expr is ISExpression[])
            {
                arr = (ISExpression[])expr;
            }
            else
            {
                throw new InvalidOperationException("parser error, unknown type: " + expr.GetType().Name);
            }

            return(arr);
        }
Пример #4
0
        public static IEnumerable <ISExpression> Flatten(this ISExpression s)
        {
            var ss = new List <ISExpression>();

            if (s.IsNil())
            {
                ss.Add(s);
                return(ss);
            }

            var ok = s is Cons;

            while (ok)
            {
                var c = s as Cons;
                ss.Add(c.Car);
                s  = c.Cdr;
                ok = s is Cons;
            }

            if (s != AtomHelper.Nil)
            {
                throw new InvalidOperationException("list is not flat");
            }

            return(ss);
        }
Пример #5
0
        private static void RecursivePrettyPrint(ISExpression x, int depth)
        {
            Console.Write(new String('\t', depth));

            if ((x.Type & Types.Atom) == Types.Atom)
            {
                if ((x.Type & Types.String) == Types.String)
                {
                    Console.WriteLine(String.Format("string: \"{0}\"", x.ToString()));
                }
                else if ((x.Type & Types.Symbol) == Types.Symbol)
                {
                    Console.WriteLine(String.Format("symbol: {0}", x.ToString()));
                }
                else if ((x.Type & Types.Number) == Types.Number)
                {
                    Console.WriteLine(String.Format("number: {0}", x.ToString()));
                }
            }
            else if ((x.Type & Types.List) == Types.List)
            {
                Console.WriteLine("list");
                SExprList list = x as SExprList;
                foreach (ISExpression y in list)
                {
                    SExpression.RecursivePrettyPrint(y, depth + 1);
                }
            }
        }
Пример #6
0
        private IDictionary <SymbolAtom, ISExpression> CreateMap(ISExpression vars, Stack <ISExpression> rib)
        {
            var map = new Dictionary <SymbolAtom, ISExpression>();

            var vflat = vars.Flatten();

            if (vflat.Count() == 1 && vflat.First() == AtomHelper.Nil)
            {
                vflat = Enumerable.Empty <ISExpression>();
            }

            // this gets weird because native needs the args
            // and we are wrapping all natives in a zero arg lambda
            if (vflat.Count() != rib.Count)
            {
                ThrowErr("apply", "attempted application of function with incorrect number of parameters", $"({vars.String()})");
            }

            if (vars != AtomHelper.Nil)
            {
                foreach (var v in vflat)
                {
                    if (!v.IsSymbol())
                    {
                        ThrowErr("apply", "attempted application of function with incorrectly defined bindings", $"({vars.String()})");
                    }


                    map[v as SymbolAtom] = rib.Pop();
                }
            }
            return(map);
        }
Пример #7
0
        public static bool IsInteger(this ISExpression sexpr)
        {
            var c = (sexpr as NumberAtom)?.Val;

            return(IsRational(sexpr) &&
                   (c == Complex.CreateExactReal(0) || c.IsInteger));
        }
Пример #8
0
        public static IInstruction Compile(ISchemeVM vm, ISExpression expr)
        {
            var p1 = DoPass <RewriteLetPass, ISExpression, ISExpression>(vm, expr);
            var p2 = DoPass <RewriteTwoArmIfPass, ISExpression, ISExpression>(vm, p1);
            var p3 = DoPass <InstructionPass, ISExpression, IInstruction>(vm, p2);

            return(p3);
        }
Пример #9
0
 public static ISExpression GetUnsafeCdr(this ISExpression e)
 {
     if (e.IsCons())
     {
         return((e as Cons).Cdr);
     }
     throw new InvalidOperationException("expression was not cons");
 }
Пример #10
0
 public bool Equals(ISExpression other)
 {
     if (other is Procedure)
     {
         var p = other as Procedure;
         return(Name == p.Name && Proc == p.Proc && Primitive == p.Primitive);
     }
     return(false);
 }
Пример #11
0
        public void DefineHere(ISExpression sym, ISExpression val)
        {
            var s = sym as SymbolAtom;

            Map[s] = new EnvThunk()
            {
                Val = val
            };
        }
Пример #12
0
 public bool Equals(ISExpression other)
 {
     if (other is Cons)
     {
         var c = other as Cons;
         return(Car.Equals(c.Car) && Cdr.Equals(c.Cdr));
     }
     return(false);
 }
Пример #13
0
 public bool Equals(ISExpression other)
 {
     if (other is Closure)
     {
         var c = other as Closure;
         return(Body == c.Body && Vars == c.Vars);
     }
     return(false);
 }
Пример #14
0
 public bool Equals(ISExpression other)
 {
     if (other is AtomBase <T> )
     {
         var a = other as AtomBase <T>;
         return(Val.Equals(a.Val));
     }
     return(false);
 }
Пример #15
0
        public bool Set(ISExpression sym, ISExpression val)
        {
            var s = sym as SymbolAtom;

            if (Map.ContainsKey(s))
            {
                Map[s].Val = val;
                return(true);
            }
            return(false);
        }
Пример #16
0
        public static ISExpression Unflatten(this IEnumerable <ISExpression> ss)
        {
            ISExpression c = AtomHelper.Nil;

            ss = ss.Reverse();
            foreach (var s in ss)
            {
                c = AtomHelper.CreateCons(s, c);
            }
            return(c);
        }
Пример #17
0
        public ISExpression Lookup(ISExpression sym)
        {
            if (!sym.IsSymbol())
            {
                throw new InvalidOperationException();
            }

            if (IsDefined(sym))
            {
                return(Map[sym as SymbolAtom].Val);
            }

            return(null);
        }
Пример #18
0
 public bool Set(SymbolAtom sym, ISExpression sexpr)
 {
     if (IsDefinedHere(sym))
     {
         DefineHere(sym, sexpr);
         return(true);
     }
     else if (Parent == null)
     {
         return(false);
     }
     else
     {
         return(Parent.Set(sym, sexpr));
     }
 }
Пример #19
0
        public static IEnumerable <ISExpression> FlattenImproper(this ISExpression s)
        {
            var ss = new List <ISExpression>();

            var ok = s is Cons;

            while (ok)
            {
                var c = s as Cons;
                ss.Add(c.Car);
                s  = c.Cdr;
                ok = s is Cons;
            }
            ss.Add(s);

            return(ss);
        }
Пример #20
0
        private static int ListCount(ISExpression e, int sum)
        {
            if (!e.IsList())
            {
                throw new InvalidOperationException("can't list count something that isn't a list");
            }

            var c = e as Cons;

            if (c.Cdr == AtomHelper.Nil)
            {
                return(sum + 1);
            }
            else
            {
                return(ListCount(c.Cdr, sum + 1));
            }
        }
Пример #21
0
        public bool Equals(ISExpression other)
        {
            if (other is Vector)
            {
                var v = other as Vector;
                if (Values.Count() != v.Values.Count())
                {
                    return(false);
                }

                for (var i = 0; i < Values.Count(); i++)
                {
                    if (!Values[i].Equals(v.Values[i]))
                    {
                        return(false);
                    }
                }

                return(true);
            }
            return(false);
        }
Пример #22
0
 public static bool IsComplex(this ISExpression sexpr)
 {
     return(IsNumber(sexpr));
 }
Пример #23
0
 public void DefineHere(SymbolAtom sym, ISExpression sexpr)
 {
     Data[sym] = sexpr;
 }
Пример #24
0
 public bool Equals(ISExpression other)
 {
     return(other is NilAtom);
 }
Пример #25
0
 public static bool IsCons(this ISExpression sexpr)
 {
     return(sexpr is Cons);
 }
Пример #26
0
 public static bool IsRational(this ISExpression sexpr)
 {
     return(IsReal(sexpr) && ((NumberAtom)(sexpr)).IsReal());
 }
Пример #27
0
 public static bool IsReal(this ISExpression sexpr)
 {
     return(IsComplex(sexpr) && ((NumberAtom)(sexpr)).Val.Imag.IsZero);
 }
Пример #28
0
 public static bool IsVector(this ISExpression sexpr)
 {
     return(sexpr is Vector);
 }
Пример #29
0
 public static bool IsEnvironment(this ISExpression sexpr)
 {
     return(sexpr is VirtualMachine.Environment);
 }
Пример #30
0
 public static bool IsNil(this ISExpression sexpr)
 {
     return(sexpr is NilAtom);
 }