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)); }
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); }
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); }
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; }
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; }