コード例 #1
0
ファイル: Prim0.cs プロジェクト: ichaos/Shovel
        internal static Value ShovelStringRepresentation(VmApi api, Value obj)
        {
            var result = Value.Make(ShovelStringRepresentationImpl(api, obj, new HashSet <object> ()));

            api.CellsIncrementer(result.StringValue.Length);
            return(result);
        }
コード例 #2
0
ファイル: Prim0.cs プロジェクト: ichaos/Shovel
        static Value HashConstructor(VmApi api, Value[] args, int start, int length)
        {
            if (args.Length % 2 != 0)
            {
                api.RaiseShovelError("Must provide an even number of arguments.");
            }
            var sizeIncrease = 1 + 2 * args.Length;

            api.CellsIncrementHerald(sizeIncrease);
            var result = new Dictionary <Value, Value> ();

            for (var i = start; i < start + length; i += 2)
            {
                if (args [i].Kind == Value.Kinds.String)
                {
                    result [args [i]] = args [i + 1];
                }
                else
                {
                    api.RaiseShovelError("Keys must be strings");
                }
            }
            api.CellsIncrementer(sizeIncrease);
            return(Value.Make(result));
        }
コード例 #3
0
ファイル: Prim0.cs プロジェクト: ichaos/Shovel
 static Value StringLower(VmApi api, Value str)
 {
     CheckString(api, str);
     api.CellsIncrementer(str.StringValue.Length);
     return(Value.Make(str.StringValue.ToLower()));
 }
コード例 #4
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 static Value DecodeTime(VmApi api, Value timeInSeconds)
 {
     if (timeInSeconds.Kind != Value.Kinds.Integer) {
         api.RaiseShovelError ("Argument must be an integer.");
     }
     var epochTimeSpan = TimeSpan.FromSeconds (timeInSeconds.integerValue);
     var date = Prim0.unixEpoch + epochTimeSpan;
     var result = new HashInstance ();
     result [Value.Make ("year")] = Value.MakeInt (date.Year);
     result [Value.Make ("month")] = Value.MakeInt (date.Month);
     result [Value.Make ("day")] = Value.MakeInt (date.Day);
     var dayOfWeekKey = Value.Make ("dayOfWeek");
     switch (date.DayOfWeek) {
     case DayOfWeek.Monday:
         result [dayOfWeekKey] = Value.MakeInt (1);
         break;
     case DayOfWeek.Tuesday:
         result [dayOfWeekKey] = Value.MakeInt (2);
         break;
     case DayOfWeek.Wednesday:
         result [dayOfWeekKey] = Value.MakeInt (3);
         break;
     case DayOfWeek.Thursday:
         result [dayOfWeekKey] = Value.MakeInt (4);
         break;
     case DayOfWeek.Friday:
         result [dayOfWeekKey] = Value.MakeInt (5);
         break;
     case DayOfWeek.Saturday:
         result [dayOfWeekKey] = Value.MakeInt (6);
         break;
     case DayOfWeek.Sunday:
         result [dayOfWeekKey] = Value.MakeInt (7);
         break;
     }
     result [Value.Make ("hour")] = Value.MakeInt (date.Hour);
     result [Value.Make ("minute")] = Value.MakeInt (date.Minute);
     result [Value.Make ("second")] = Value.MakeInt (date.Second);
     api.CellsIncrementer (8);
     return Value.Make (result);
 }
コード例 #5
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 static Value ArrayConstructor(VmApi api, Value[] args, int start, int length)
 {
     var result = new ArrayInstance ();
     var sizeIncrease = 1 + length;
     api.CellsIncrementHerald (sizeIncrease);
     for (var i = start; i < start+length; i++) {
         result.Add (args [i]);
     }
     api.CellsIncrementer (sizeIncrease);
     return Value.Make (result);
 }
コード例 #6
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 internal static Value ShovelStringRepresentation(VmApi api, Value obj)
 {
     var result = Value.Make (ShovelStringRepresentationImpl (api, obj, new HashSet<object> ()));
     api.CellsIncrementer (result.stringValue.Length);
     return result;
 }
コード例 #7
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 internal static Value ShovelString(VmApi api, Value obj)
 {
     var result = ShovelStringImpl (api, obj);
     api.CellsIncrementer (result.Length);
     return Value.Make (result);
 }
コード例 #8
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 internal static void Keys(VmApi api, ref Value hash)
 {
     if (hash.Kind != Value.Kinds.Hash) {
         api.RaiseShovelError ("First argument must be a hash table.");
     }
     var result = new ArrayInstance ();
     var sizeIncrease = 1 + hash.hashValue.Count;
     api.CellsIncrementHerald (sizeIncrease);
     result.AddRange (hash.hashValue.Keys);
     hash.arrayValue = result;
     hash.Kind = Value.Kinds.Array;
     api.CellsIncrementer (sizeIncrease);
 }
コード例 #9
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 static Value Format(VmApi api, Value[] args, int start, int length)
 {
     CheckString(api, args[start]);
     var formatArgs = new List<object>();
     for (int i = 1; i < length; i++) {
         var arg = args[i + start];
         switch(arg.Kind) {
             case Value.Kinds.Array:
                 formatArgs.Add(ShovelStringRepresentation(api, arg));
                 break;
             case Value.Kinds.Bool:
                 formatArgs.Add(arg.boolValue);
                 break;
             case Value.Kinds.Callable:
                 api.RaiseShovelError("Cannot call 'format' on callables.");
                 break;
             case Value.Kinds.Double:
                 formatArgs.Add(arg.doubleValue);
                 break;
             case Value.Kinds.Hash:
                 formatArgs.Add(ShovelStringRepresentation(api, arg));
                 break;
             case Value.Kinds.Integer:
                 formatArgs.Add(arg.integerValue);
                 break;
             case Value.Kinds.NamedBlock:
                 api.RaiseShovelError("Cannot call 'format' on named blocks.");
                 break;
             case Value.Kinds.Null:
                 formatArgs.Add(ShovelStringRepresentation(api, arg));
                 break;
             case Value.Kinds.ReturnAddress:
                 api.RaiseShovelError("Cannot call 'format' on return addresses.");
                 break;
             case Value.Kinds.String:
                 formatArgs.Add(arg.stringValue);
                 break;
             case Value.Kinds.Struct:
                 formatArgs.Add(ShovelStringRepresentation(api, arg));
                 break;
             case Value.Kinds.StructInstance:
                 formatArgs.Add(ShovelStringRepresentation(api, arg));
                 break;
             default:
                 api.RaiseShovelError(String.Format(
                     "'format' called with unknown value ('{0}').", arg.Kind.ToString()));
                 break;
         }
     }
     api.CellsIncrementer(1);
     return Value.Make(String.Format(args[start].stringValue, formatArgs.ToArray()));
 }
コード例 #10
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 static Value StructToHash(VmApi api, Value[] args, int start, int length)
 {
     if (args [start].Kind != Value.Kinds.StructInstance) {
         api.RaiseShovelError ("First argument must be a struct instance.");
     }
     var result = new HashInstance ();
     var structInstance = args [start].structInstanceValue;
     var ztruct = structInstance.Struct;
     var sizeIncrease = 1 + 2 * ztruct.Fields.Length;
     api.CellsIncrementHerald (sizeIncrease);
     for (int i = 0; i < ztruct.Fields.Length; i++) {
         result [Value.Make (ztruct.Fields [i])] = structInstance.Values [i];
     }
     api.CellsIncrementer (sizeIncrease);
     return Value.Make (result);
 }
コード例 #11
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 static Value StringUpper(VmApi api, Value str)
 {
     CheckString (api, str);
     api.CellsIncrementer (str.stringValue.Length);
     api.CellsIncrementer (str.stringValue.Length);
     return Value.Make (str.stringValue.ToUpper ());
 }
コード例 #12
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 static Value SizedArrayConstructor(VmApi api, Value size)
 {
     if (size.Kind != Value.Kinds.Integer) {
         api.RaiseShovelError ("Argument must be an integer.");
     }
     var result = new ArrayInstance ();
     var sizeIncrease = 1 + (int)size.integerValue;
     api.CellsIncrementHerald (sizeIncrease);
     for (var i = 0; i < size.integerValue; i++) {
         result.Add (Value.Make ());
     }
     api.CellsIncrementer (sizeIncrease);
     return Value.Make (result);
 }
コード例 #13
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 static Value InstantiateStruct(VmApi api, Value[] args, int start, int length)
 {
     if (length == 0) {
         api.RaiseShovelError ("Must provide at least one argument.");
     }
     if (args [start].Kind != Value.Kinds.Struct) {
         api.RaiseShovelError ("First argument must be a struct.");
     }
     var ztruct = args [start].StructValue;
     var sizeIncrease = 1 + ztruct.Fields.Length;
     api.CellsIncrementHerald (sizeIncrease);
     var result = new StructInstance ();
     result.Struct = ztruct;
     result.Values = new Value[ztruct.Fields.Length];
     for (int i = 1; i < length; i++) {
         result.Values [i - 1] = args [start + i];
     }
     api.CellsIncrementer (sizeIncrease);
     return Value.Make (result);
 }
コード例 #14
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
        static Value HashToStruct(VmApi api, Value[] args, int start, int length)
        {
            if (args [start].Kind != Value.Kinds.Struct) {
                api.RaiseShovelError ("First argument must be a struct.");
            }
            if (args [start + 1].Kind != Value.Kinds.Hash) {
                api.RaiseShovelError ("Second argument must be a hash.");
            }

            var ztruct = args [start].StructValue;
            var result = new StructInstance ();
            result.Struct = ztruct;
            result.Values = new Value[ztruct.Fields.Length];
            var hash = args [start + 1].hashValue;
            var sizeIncrease = 1 + ztruct.Fields.Length;
            api.CellsIncrementHerald (sizeIncrease);
            for (int i = 0; i < ztruct.Fields.Length; i++) {
                var svKey = Value.Make (ztruct.Fields [i]);
                if (hash.ContainsKey (svKey)) {
                    result.Values [i] = hash [svKey];
                }
            }
            api.CellsIncrementer (sizeIncrease);
            return Value.Make (result);
        }
コード例 #15
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 static Value HashConstructor(VmApi api, Value[] args, int start, int length)
 {
     if (length % 2 != 0) {
         api.RaiseShovelError ("Must provide an even number of arguments.");
     }
     var sizeIncrease = 1 + 2 * length;
     api.CellsIncrementHerald (sizeIncrease);
     var result = new HashInstance ();
     for (var i = start; i < start + length; i += 2) {
         if (args [i].Kind == Value.Kinds.String) {
             result [args [i]] = args [i + 1];
         } else {
             api.RaiseShovelError ("Keys must be strings");
         }
     }
     api.CellsIncrementer (sizeIncrease);
     return Value.Make (result);
 }
コード例 #16
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 static Value GetSlice(VmApi api, Value arrayOrString, Value start, Value end)
 {
     if (start.Kind != Value.Kinds.Integer) {
         api.RaiseShovelError ("The start index must be an integer.");
         throw new InvalidOperationException ();
     }
     if (end.Kind != Value.Kinds.Integer) {
         api.RaiseShovelError ("The end index must be an integer.");
         throw new InvalidOperationException ();
     }
     if (arrayOrString.Kind == Value.Kinds.Array) {
         var length = arrayOrString.arrayValue.Count;
         var realStart = (int)start.integerValue;
         var realEnd = (int)end.integerValue;
         AdjustRealStartEnd (api, ref realStart, ref realEnd, length);
         api.CellsIncrementer (realEnd - realStart);
         return Value.Make (
             arrayOrString.arrayValue.GetRange2 (realStart, realEnd - realStart));
     } else if (arrayOrString.Kind == Value.Kinds.String) {
         var length = arrayOrString.stringValue.Length;
         var realStart = (int)start.integerValue;
         var realEnd = (int)end.integerValue;
         AdjustRealStartEnd (api, ref realStart, ref realEnd, length);
         api.CellsIncrementer (realEnd - realStart);
         return Value.Make (
             arrayOrString.stringValue.Substring (realStart, realEnd - realStart));
     } else {
         api.RaiseShovelError ("Argument must be a string or an array.");
         throw new InvalidOperationException ();
     }
 }
コード例 #17
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 internal static void ArrayPush(VmApi api, ref Value array, ref Value value)
 {
     CheckVector (api, ref array);
     array.arrayValue.Add (value);
     array = value;
     api.CellsIncrementer (1);
 }
コード例 #18
0
ファイル: Prim0.cs プロジェクト: mbrezu/Shovel
 static Value Defstruct(VmApi api, Value[] args, int start, int length)
 {
     if (args [start].Kind != Value.Kinds.Array) {
         api.RaiseShovelError ("Argument must be an array of strings.");
     }
     var fieldNames = args [start].arrayValue;
     var sizeIncrease = 1 + length;
     api.CellsIncrementHerald (sizeIncrease);
     Struct newStruct = new Struct ();
     newStruct.Fields = new string[fieldNames.Count];
     for (int i = 0; i < newStruct.Fields.Length; i++) {
         if (fieldNames [i].Kind != Value.Kinds.String) {
             api.RaiseShovelError ("Argument must be an array of strings.");
         }
         newStruct.Fields [i] = fieldNames [i].stringValue;
     }
     api.CellsIncrementer (sizeIncrease);
     return Value.Make (newStruct);
 }