Example #1
0
 public object MarshallToBike(object dotNetObject)
 {
     if (dotNetObject == null || dotNetObject is BikeObject)
     {
         return(dotNetObject);
     }
     if (dotNetObject is bool)
     {
         return(new BikeBoolean((bool)dotNetObject));
     }
     if (dotNetObject is char)
     {
         return(new BikeString(dotNetObject.ToString()));
     }
     if (dotNetObject is string)
     {
         return(new BikeString((string)dotNetObject));
     }
     if (IsNumber(dotNetObject))
     {
         return(new BikeNumber(Convert.ToDecimal(dotNetObject)));
     }
     if (dotNetObject is Array)
     {
         var ba  = new BikeArray();
         var arr = (Array)dotNetObject;
         for (int i = 0; i < arr.Length; i++)
         {
             ba.Value.Add(MarshallToBike(arr.GetValue(i)));
         }
         return(ba);
     }
     return(dotNetObject);
 }
        public object CallBikeFunction(BikeFunction function, object self, object[] argValues)
        {
            var parameters = function.Parameters;
            Action <ScopeFrame> bindArgs = scopeFrame =>
            {
                scopeFrame.Define("this", self);
                for (var i = 0; i < parameters.Count; i++)
                {
                    var argName = parameters[i].Identifier.Value;
                    if (i < argValues.Length)                     // normal parameter
                    {
                        if (parameters[i].IsParams)               // collapse
                        {
                            var bk = new BikeArray();
                            for (var j = i; j < argValues.Length; j++)
                            {
                                bk[j - i] = argValues[j];
                            }
                            scopeFrame.Define(argName, bk);
                        }
                        else
                        {
                            scopeFrame.Define(argName, argValues[i]);
                        }
                    }
                    else                     // optional parameter
                    {
                        scopeFrame.Define(argName, null);
                    }
                }
            };
            Func <object> execute = () =>
            {
                try
                {
                    return(function.Body.Accept(this));
                }
                catch (Return r)
                {
                    return(r.Value);
                }
            };

            return(Context.OpenScopeFor(execute,
                                        withInit: bindArgs,
                                        parentScope: function.BoundScope,
                                        func: function));
        }
Example #3
0
 public object CallBikeFunction(BikeFunction function, object self, object[] argValues)
 {
     var parameters = function.Parameters;
     Action<ScopeFrame> bindArgs = scopeFrame =>
     {
         scopeFrame.Define("this", self);
         for (var i = 0; i < parameters.Count; i++)
         {
             var argName = parameters[i].Identifier.Value;
             if (i < argValues.Length) // normal parameter
             {
                 if (parameters[i].IsParams) // collapse
                 {
                     var bk = new BikeArray();
                     for (var j = i; j < argValues.Length; j++)
                     {
                         bk[j - i] = argValues[j];
                     }
                     scopeFrame.Define(argName, bk);
                 }
                 else
                 {
                     scopeFrame.Define(argName, argValues[i]);
                 }
             }
             else // optional parameter
             {
                 scopeFrame.Define(argName, null);
             }
         }
     };
     Func<object> execute = () =>
     {
         try
         {
             return function.Body.Accept(this);
         }
         catch (Return r)
         {
             return r.Value;
         }
     };
     return Context.OpenScopeFor(execute,
                                 withInit: bindArgs,
                                 parentScope: function.BoundScope,
                                 func: function);
 }
Example #4
0
        public override object Walk(ArrayLiteral node)
        {
            var array = new BikeArray();

            if (node.IsRange)
            {
                var from      = node.Expressions[0].Accept(this);
                var fromValue = ((BikeNumber)from).Value;
                if ((fromValue % 1) != 0)
                {
                    throw ErrorFactory.CreateTypeError("Array range initializer must start with a whole number");
                }

                var end      = node.Expressions[1].Accept(this);
                var endValue = ((BikeNumber)end).Value;
                if ((endValue % 1) != 0)
                {
                    throw ErrorFactory.CreateTypeError("Array range initializer must end with a whole number");
                }

                if (fromValue <= endValue)
                {
                    int index = 0;
                    for (var i = (int)fromValue; i < (int)endValue; i++)
                    {
                        array.Define((index++).ToString(), new BikeNumber(i));
                    }
                }
                else
                {
                    int index = 0;
                    for (var i = (int)fromValue; i > (int)endValue; i--)
                    {
                        array.Define((index++).ToString(), new BikeNumber(i));
                    }
                }
                return(array);
            }
            for (int i = 0; i < node.Expressions.Count; i++)
            {
                var value = node.Expressions[i].Accept(this);
                array.Define(i.ToString(), value);
            }
            return(array);
        }
Example #5
0
        public override object Walk(ArrayLiteral node)
        {
            var array = new BikeArray();
            if (node.IsRange)
            {
                var from = node.Expressions[0].Accept(this);
                var fromValue = ((BikeNumber) from).Value;
                if ((fromValue % 1) != 0)
                    throw ErrorFactory.CreateTypeError("Array range initializer must start with a whole number");

                var end = node.Expressions[1].Accept(this);
                var endValue = ((BikeNumber)end).Value;
                if ((endValue % 1) != 0)
                    throw ErrorFactory.CreateTypeError("Array range initializer must end with a whole number");

                if (fromValue <= endValue)
                {
                    int index = 0;
                    for (var i = (int) fromValue; i < (int) endValue; i++)
                    {
                        array.Define((index++).ToString(), new BikeNumber(i));
                    }
                }
                else
                {
                    int index = 0;
                    for (var i = (int)fromValue; i > (int)endValue; i--)
                    {
                        array.Define((index++).ToString(), new BikeNumber(i));
                    }
                }
                return array;
            }
            for (int i = 0; i < node.Expressions.Count; i++)
            {
                var value = node.Expressions[i].Accept(this);
                array.Define(i.ToString(), value);
            }
            return array;
        }
Example #6
0
 public object MarshallToBike(object dotNetObject)
 {
     if (dotNetObject == null || dotNetObject is BikeObject)
         return dotNetObject;
     if (dotNetObject is bool)
         return new BikeBoolean((bool)dotNetObject);
     if (dotNetObject is char)
         return new BikeString(dotNetObject.ToString());
     if (dotNetObject is string)
         return new BikeString((string)dotNetObject);
     if (IsNumber(dotNetObject))
         return new BikeNumber(Convert.ToDecimal(dotNetObject));
     if (dotNetObject is Array)
     {
         var ba = new BikeArray();
         var arr = (Array)dotNetObject;
         for (int i = 0; i < arr.Length; i++)
         {
             ba.Value.Add(MarshallToBike(arr.GetValue(i)));
         }
         return ba;
     }
     return dotNetObject;
 }