Example #1
0
        public static SExpression Cast(SExprComp c)
        {
            if (c.Atomics.Count == 0)
            {
                return(new SEList(c));
            }

            var _head = c.Atomics.Pop();

            if (_head is SExprComp)
            {
                if (c.Atomics.Count == 0)
                {
                    return(SExpression.Cast(_head));
                }
                else
                {
                    var first = _head;
                    while (first is SExprComp)
                    {
                        first = (first as SExprComp).Atomics[0];
                    }

                    return(new SECall(SExpression.Cast(_head),
                                      (from a in c.Atomics select SExpression.Cast(a)).ToList(),
                                      first as SExprAtomic, c));
                }
            }

            var head = _head as SExprAtomic;

            if (head.Token.TType == SToken.TokenType.ATOMIC)
            {
                string tvalue = (string)head.Token.TValue;
                if (SExpression.KeywordsLookup.ContainsKey(tvalue))
                {
                    return(SExpression.KeywordsLookup[tvalue](head, c));
                }
                else
                {
                    if (c.Atomics.Count == 0)
                    {
                        return(new SEVariable(tvalue, head, c));
                    }
                    else
                    {
                        return(new SECall(tvalue, (from a in c.Atomics select SExpression.Cast(a)).ToList(), head, c));
                    }
                }
            }
            else if (head.Token.TType == SToken.TokenType.STRING || head.Token.TType == SToken.TokenType.NUMBER)
            {
                c.Atomics.Insert(0, head);
                return(new SEList(c));
            }
            else
            {
                throw new VMException("invalid cast", head);
            }
        }
Example #2
0
        public SECond(SExprAtomic ha, SExprComp c)
        {
            if (c.Atomics.Count < 2)
            {
                throw new VMException("at least 1 branch must be defined", ha);
            }

            condition = SExpression.Cast(c.Atomics.Pop());
            branches  = new List <Tuple <SExpression, SExpression> >();

            foreach (var a in c.Atomics)
            {
                var b = a as SExprComp;
                if (b == null || b.Atomics.Count < 2)
                {
                    throw new VMException("each branch must be a compound", ha);
                }

                var cond = b.Atomics.Pop();

                if (cond is SExprAtomic &&
                    ((SExprAtomic)cond).Token.TType == SToken.TokenType.ATOMIC &&
                    (string)((SExprAtomic)cond).Token.TValue == "_")
                {
                    defaultBranch = SExpression.Cast(b.Atomics.Pop());
                }
                else
                {
                    branches.Add(new Tuple <SExpression, SExpression>(
                                     SExpression.Cast(cond),
                                     SExpression.Cast(b.Atomics.Pop())
                                     ));
                }
            }
        }
Example #3
0
        public override SValue Evaluate(ExecEnvironment env)
        {
            var text = this.text.Evaluate(env) as SString;

            if (text == null)
            {
                throw new VMException("must eval a string", headAtom);
            }

            if (this.env != null)
            {
                var e = this.env.Evaluate(env) as SDict;
                if (e == null)
                {
                    throw new VMException("the second argument must be a dict if provided", headAtom);
                }

                env = new ExecEnvironment();
                foreach (var kv in e.Get <Dictionary <string, SValue> >())
                {
                    env[kv.Key] = kv.Value;
                }
            }

            var p = new Parser();
            var s = p.Parse(text.Get <String>(), "", "<eval>");

            return(SExpression.Cast(s).Evaluate(env));
        }
Example #4
0
        public SERegexMatch(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count > 1)
            {
                regex = SExpression.Cast(c.Atomics.Pop());
                text  = SExpression.Cast(c.Atomics.Pop());

                if (c.Atomics.Count > 0)
                {
                    start = SExpression.Cast(c.Atomics.Pop());
                }
                else
                {
                    start = new SNumber(0);
                }

                if (c.Atomics.Count > 0)
                {
                    length = SExpression.Cast(c.Atomics.Pop());
                }
                else
                {
                    length = new SNumber(-1);
                }
            }
            else
            {
                throw new VMException("it takes at least 2 arguments", ha);
            }
        }
Example #5
0
        public SESet(SExprAtomic ha, SExprComp c, bool imm) : base(ha, c)
        {
            if (c.Atomics.Count < 1)
            {
                throw new VMException("it takes at least 1 argument", ha);
            }

            var n = c.Atomics.Pop();

            if (n is SExprAtomic && (n as SExprAtomic).Token.TType == SToken.TokenType.ATOMIC)
            {
                varName = (string)(n as SExprAtomic).Token.TValue;
            }
            else
            {
                nameExpr = SExpression.Cast(n);
            }

            if (c.Atomics.Count > 0)
            {
                varValue = SExpression.Cast(c.Atomics.Pop());
            }
            else
            {
                varValue = new SNull();
            }

            makeImmutable = imm;
        }
Example #6
0
 public SEInteropGetType(SExprAtomic ha, SExprComp c) : base(ha, c)
 {
     if (c.Atomics.Count != 1)
     {
         throw new VMException("it takes 1 argument", ha);
     }
     typeName = SExpression.Cast(c.Atomics.Pop());
 }
Example #7
0
        public SEUnsafe(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count != 1)
            {
                throw new VMException("it takes 1 argument", ha);
            }

            obj = SExpression.Cast(c.Atomics.Pop());
        }
Example #8
0
        public SESub(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count != 2 && c.Atomics.Count != 3)
            {
                throw new VMException("it takes 2 or 3 arguments", ha);
            }

            arguments = (from a in c.Atomics select SExpression.Cast(a)).ToList();
        }
Example #9
0
        public SEKeys(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count != 1)
            {
                throw new VMException("it takes 1 argument");
            }

            dict = SExpression.Cast(c.Atomics.Pop());
        }
Example #10
0
        public SEStr(SExprAtomic ha, SExprComp c, bool chr) : base(ha, c)
        {
            if (c.Atomics.Count != 1)
            {
                throw new VMException("it takes 1 argument");
            }

            argument   = SExpression.Cast(c.Atomics.Pop());
            convertChr = chr;
        }
Example #11
0
        public SESplit(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count != 2)
            {
                throw new VMException("it takes 2 arguments", ha);
            }

            text  = SExpression.Cast(c.Atomics.Pop());
            delim = SExpression.Cast(c.Atomics.Pop());
        }
Example #12
0
        public SEInteropNew(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count < 1)
            {
                throw new VMException("it takes at least 1 argument", ha);
            }

            type      = SExpression.Cast(c.Atomics.Pop());
            arguments = c.Atomics.Select(a => SExpression.Cast(a)).ToList();
        }
Example #13
0
        public SEFor(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count < 2)
            {
                throw new VMException("it takes 2 arguments", ha);
            }

            list = SExpression.Cast(c.Atomics.Pop());
            body = SExpression.Cast(c.Atomics.Pop());
        }
Example #14
0
        public SEMultiCore(SExprAtomic ha, SExprComp c, string f) : base(ha, c)
        {
            argumentExprs = (from a in c.Atomics select SExpression.Cast(a)).ToList();
            func          = f;

            if (argumentExprs.Count < 1)
            {
                throw new VMException("it takes at least 1 argument", ha);
            }
        }
Example #15
0
        public SEPrint(SExprAtomic ha, SExprComp c, string d) : base(ha, c)
        {
            delim = d;
            if (c.Atomics.Count == 0)
            {
                throw new VMException("it takes at least 1 argument", ha);
            }

            arguments = (from a in c.Atomics select SExpression.Cast(a)).ToList();
        }
Example #16
0
        public SEInteropGetSetMember(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count < 2)
            {
                throw new VMException("it takes at least 2 arguments", ha);
            }

            obj      = SExpression.Cast(c.Atomics.Pop());
            propName = SExpression.Cast(c.Atomics.Pop());
        }
Example #17
0
        public SEGet(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count < 2)
            {
                throw new VMException("it takes at least 2 arguments", ha);
            }

            dict = SExpression.Cast(c.Atomics.Pop());
            keys = c.Atomics.Select(a => SExpression.Cast(a)).ToList();
        }
Example #18
0
        public SENum(SExprAtomic ha, SExprComp c, bool asc) : base(ha, c)
        {
            if (c.Atomics.Count != 1)
            {
                throw new VMException("it takes 1 argument");
            }

            argument   = SExpression.Cast(c.Atomics.Pop());
            convertAsc = asc;
        }
Example #19
0
        public SEDel(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count != 2)
            {
                throw new VMException("it takes 2 arguments", ha);
            }

            host  = SExpression.Cast(c.Atomics.Pop());
            index = SExpression.Cast(c.Atomics.Pop());
        }
Example #20
0
        public SEInteropInvokeStaticMethod(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count < 2)
            {
                throw new VMException("it takes at least 2 arguments", ha);
            }

            type       = SExpression.Cast(c.Atomics.Pop());
            methodName = SExpression.Cast(c.Atomics.Pop());
            arguments  = c.Atomics.Select(a => SExpression.Cast(a)).ToList();
        }
Example #21
0
 public SEDict(SExprAtomic ha, SExprComp c) : base(ha, c)
 {
     values = c.Atomics.Select(a =>
     {
         if (!(a is SExprComp) || (a as SExprComp).Atomics.Count != 2)
         {
             throw new VMException("each element of the dict must be a list with 2 elements", ha);
         }
         return(SExpression.Cast(a));
     }).ToList();
 }
Example #22
0
        public SEEval(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count != 1 && c.Atomics.Count != 2)
            {
                throw new VMException("it takes 1 or 2 arguments");
            }

            text = SExpression.Cast(c.Atomics.Pop());
            if (c.Atomics.Count > 0)
            {
                env = SExpression.Cast(c.Atomics.Pop());
            }
        }
Example #23
0
        public SELambda(SExprAtomic ha, SExprComp c)
        {
            if (c.Atomics.Count < 2)
            {
                throw new VMException("missing lambda body", ha);
            }
            if (!(c.Atomics[0] is SExprComp))
            {
                throw new VMException("the first argument must be the declaration", ha);
            }

            arguments = SELambda.CompoundToArguments(c.Atomics.Pop() as SExprComp, ha);
            body      = SExpression.Cast(c.Atomics.Pop());
        }
Example #24
0
        public SEIf(SExprAtomic ha, SExprComp c)
        {
            if (c.Atomics.Count == 0)
            {
                throw new VMException("missing true branch", ha);
            }
            if (c.Atomics.Count == 1)
            {
                throw new VMException("missing false branch", ha);
            }

            condition   = SExpression.Cast(c.Atomics.Pop());
            trueBranch  = SExpression.Cast(c.Atomics.Pop());
            falseBranch = SExpression.Cast(c.Atomics.Pop());
        }
Example #25
0
        public object ExecuteFile(string filePath, ExecEnvironment ee)
        {
            string code = File.ReadAllText(filePath);

            var p      = new Parser();
            var path   = EugineVM.GetDirectoryName(filePath);
            var source = Path.GetFileName(filePath);

            ee["~path"]   = new SString(path);
            ee["~source"] = new SString(source);

            var s = p.Parse(code, path, source);

            return(SExpression.Cast(s).Evaluate(ee).Get <object>());
        }
Example #26
0
        public SEType(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            if (c.Atomics.Count == 0)
            {
                throw new VMException("it takes 1 argument", ha);
            }

            var n = c.Atomics.Pop();

            if (n is SExprAtomic && (n as SExprAtomic).Token.TType == SToken.TokenType.ATOMIC)
            {
                vname = (string)(n as SExprAtomic).Token.TValue;
            }
            else
            {
                nameExpr = SExpression.Cast(n);
            }
        }
Example #27
0
 public SERegex(SExprAtomic ha, SExprComp c) : base(ha, c)
 {
     if (c.Atomics.Count > 0)
     {
         re = SExpression.Cast(c.Atomics.Pop());
         if (c.Atomics.Count > 0)
         {
             option = SExpression.Cast(c.Atomics.Pop());
         }
         else
         {
             option = new SString("None");
         }
     }
     else
     {
         throw new VMException("it takes 1 or 2 arguments", ha);
     }
 }
Example #28
0
        public object ExecuteString(string code, ExecEnvironment ee)
        {
            var p      = new Parser();
            var path   = "";
            var source = "";

            if (ee.ContainsKey("~path"))
            {
                path = ee["~path"].Evaluate(null).Get <String>();
            }
            if (ee.ContainsKey("~source"))
            {
                source = ee["~source"].Evaluate(null).Get <String>();
            }

            var s = p.Parse(code, path, source);

            return(SExpression.Cast(s).Evaluate(ee).Get <object>());
        }
Example #29
0
        public SERange(SExprAtomic ha, SExprComp c) : base(ha, c)
        {
            var args = (from v in c.Atomics select SExpression.Cast(v)).ToList();

            if (args.Count == 2)
            {
                start    = args[0];
                end      = args[1];
                interval = new SNumber(1);
            }
            else if (args.Count == 3)
            {
                start    = args[0];
                interval = args[1];
                end      = args[2];
            }
            else
            {
                throw new VMException("it takes 2 or 3 arguments", ha);
            }
        }
Example #30
0
        public SEDefun(SExprAtomic ha, SExprComp c)
        {
            if (c.Atomics.Count < 3)
            {
                throw new VMException("missing function body", ha);
            }
            if (!(c.Atomics[1] is SExprComp))
            {
                throw new VMException("the second argument must be the declaration", ha);
            }

            var n = c.Atomics.Pop();

            if (!(n is SExprAtomic) || (n as SExprAtomic).Token.TType != SToken.TokenType.ATOMIC)
            {
                throw new VMException("function name must be an atom", ha);
            }

            func      = (string)(n as SExprAtomic).Token.TValue;
            arguments = SELambda.CompoundToArguments(c.Atomics.Pop() as SExprComp, ha);

            var tmp = c.Atomics.Pop();

            if (tmp is SExprAtomic && (tmp as SExprAtomic).Token.TType == SToken.TokenType.STRING)
            {
                description = (string)(tmp as SExprAtomic).Token.TValue;
                if (c.Atomics.Count == 0)
                {
                    throw new VMException("missing function body", ha);
                }
                body = SExpression.Cast(c.Atomics.Pop());
            }
            else
            {
                body = SExpression.Cast(tmp);
            }
        }