Esempio n. 1
0
        private static void initSuperTable()
        {
            //////////////////////////////////////////////////////
            Unit StringSlice(VM vm)
            {
                string input_string = vm.GetString(0);
                Float  start        = vm.GetNumber(1);
                Float  end          = vm.GetNumber(2);

                if (end < input_string.Length)
                {
                    string result = input_string.Substring((int)start, (int)(end - start));
                    return(new Unit(result));
                }
                return(new Unit(UnitType.Null));
            }

            methodTable.Set("slice", new IntrinsicUnit("string_slice", StringSlice, 3));

            //////////////////////////////////////////////////////

            Unit StringSplit(VM vm)
            {
                StringUnit val_input_string = vm.GetStringUnit(0);
                string     input_string     = val_input_string.ToString();
                Float      start            = vm.GetNumber(1);

                if (start < input_string.Length)
                {
                    Float  end    = input_string.Length;
                    string result = input_string.Substring((int)start, (int)(end - start));
                    val_input_string.content = input_string.Substring(0, (int)start);
                    return(new Unit(result));
                }
                return(new Unit(UnitType.Null));
            }

            methodTable.Set("split", new IntrinsicUnit("string_split", StringSplit, 2));

            //////////////////////////////////////////////////////

            Unit StringLength(VM vm)
            {
                StringUnit val_input_string = vm.GetStringUnit(0);

                return(new Unit(val_input_string.content.Length));
            }

            methodTable.Set("length", new IntrinsicUnit("string_length", StringLength, 1));

            //////////////////////////////////////////////////////

            Unit StringCopy(VM vm)
            {
                Unit val_input_string = vm.GetUnit(0);

                if (val_input_string.Type == UnitType.String)
                {
                    return(new Unit(val_input_string.ToString()));
                }
                else
                {
                    return(new Unit(UnitType.Null));
                }
            }

            methodTable.Set("copy", new IntrinsicUnit("string_copy", StringCopy, 1));

            //////////////////////////////////////////////////////
            Unit ToList(VM vm)
            {
                string      val_input_string = vm.GetString(0);
                List <Unit> string_list      = new List <Unit>();

                foreach (char c in val_input_string.ToCharArray())
                {
                    string_list.Add(new Unit(c));
                }
                return(new Unit(new ListUnit(string_list)));
            }

            methodTable.Set("to_list", new IntrinsicUnit("string_to_list", ToList, 1));

            //////////////////////////////////////////////////////
            Unit CharAt(VM vm)
            {
                string  input_string = vm.GetString(0);
                Integer index        = vm.GetInteger(1);

                if (index < input_string.Length)
                {
                    char result = input_string[(int)index];
                    return(new Unit(result));
                }
                return(new Unit(UnitType.Null));
            }

            methodTable.Set("char_at", new IntrinsicUnit("string_char_at", CharAt, 2));

            //////////////////////////////////////////////////////
            Unit Contains(VM vm)
            {
                string input_string     = vm.GetString(0);
                string contained_string = vm.GetString(1);

                return(new Unit(input_string.Contains(contained_string)));
            }

            methodTable.Set("contains", new IntrinsicUnit("string_contains", Contains, 2));

            //////////////////////////////////////////////////////
            Unit ContainsChar(VM vm)
            {
                string input_string   = vm.GetString(0);
                char   contained_char = vm.GetChar(1);

                return(new Unit(input_string.Contains(contained_char)));
            }

            methodTable.Set("contains_char", new IntrinsicUnit("string_contains_char", ContainsChar, 2));

            //////////////////////////////////////////////////////
            Unit Escape(VM vm)
            {
                string input_string = vm.GetString(0);

                return(new Unit(System.Text.RegularExpressions.Regex.Escape(input_string)));
            }

            methodTable.Set("escape", new IntrinsicUnit("string_escape", Escape, 1));

            //////////////////////////////////////////////////////
            Unit Unescape(VM vm)
            {
                string input_string = vm.GetString(0);

                return(new Unit(System.Text.RegularExpressions.Regex.Unescape(input_string)));
            }

            methodTable.Set("unescape", new IntrinsicUnit("string_unescape", Unescape, 1));
        }
Esempio n. 2
0
        private static void initMethodTable()
        {
            {
                Unit Clone(VM vm)
                {
                    TableUnit this_table = vm.GetTable(0);
                    Dictionary <Unit, Unit> table_copy = new Dictionary <Unit, Unit>();

                    foreach (KeyValuePair <Unit, Unit> entry in this_table.Map)
                    {
                        table_copy.Add(entry.Key, entry.Value);
                    }

                    TableUnit copy = new TableUnit(table_copy);

                    copy.ExtensionTable = this_table.ExtensionTable;

                    return(new Unit(copy));
                }

                methodTable.Set("clone", new IntrinsicUnit("table_clone", Clone, 1));

                //////////////////////////////////////////////////////
                Unit Count(VM vm)
                {
                    TableUnit this_table = vm.GetTable(0);
                    int       count      = this_table.Count;

                    return(new Unit(count));
                }

                methodTable.Set("count", new IntrinsicUnit("table_count", Count, 1));

                //////////////////////////////////////////////////////
                Unit Clear(VM vm)
                {
                    TableUnit this_table = vm.GetTable(0);

                    this_table.Map.Clear();
                    return(new Unit(UnitType.Null));
                }

                methodTable.Set("clear", new IntrinsicUnit("table_clear", Clear, 1));

                //////////////////////////////////////////////////////
                Unit ToString(VM vm)
                {
                    TableUnit this_table = vm.GetTable(0);
                    string    value      = "";
                    bool      first      = true;

                    foreach (KeyValuePair <Unit, Unit> entry in this_table.Map)
                    {
                        if (first)
                        {
                            value +=
                                System.Text.RegularExpressions.Regex.Unescape(entry.Key.ToString())
                                + " : " + System.Text.RegularExpressions.Regex.Unescape(entry.Value.ToString());
                            first = false;
                        }
                        else
                        {
                            value +=
                                ", "
                                + System.Text.RegularExpressions.Regex.Unescape(entry.Key.ToString())
                                + " : " + System.Text.RegularExpressions.Regex.Unescape(entry.Value.ToString());
                        }
                    }
                    return(new Unit(value));
                }

                methodTable.Set("to_string", new IntrinsicUnit("table_to_string", ToString, 1));

                //////////////////////////////////////////////////////
                Unit MakeIterator(VM vm)
                {
                    TableUnit this_table = vm.GetTable(0);

                    System.Collections.IDictionaryEnumerator enumerator = this_table.Map.GetEnumerator();

                    TableUnit iterator = new TableUnit(null);

                    iterator.Set("key", new Unit(UnitType.Null));
                    iterator.Set("value", new Unit(UnitType.Null));

                    Unit next(VM vm)
                    {
                        if (enumerator.MoveNext())
                        {
                            iterator.Set("key", (Unit)(enumerator.Key));
                            iterator.Set("value", (Unit)(enumerator.Value));
                            return(new Unit(true));
                        }
                        return(new Unit(false));
                    };

                    iterator.Set("next", new IntrinsicUnit("table_iterator_next", next, 0));
                    return(new Unit(iterator));
                }

                methodTable.Set("iterator", new IntrinsicUnit("table_iterator", MakeIterator, 1));

                //////////////////////////////////////////////////////
                Unit MakeNumericIterator(VM vm)
                {
                    TableUnit this_table = vm.GetTable(0);

                    System.Collections.IDictionaryEnumerator enumerator = this_table.Map.GetEnumerator();

                    TableUnit iterator = new TableUnit(null);

                    iterator.Set("key", new Unit(UnitType.Null));
                    iterator.Set("value", new Unit(UnitType.Null));

                    Unit next(VM vm)
                    {
                        while (true)
                        {
                            if (enumerator.MoveNext())
                            {
                                if (Unit.IsNumeric((Unit)enumerator.Key))
                                {
                                    iterator.Set("key", (Unit)(enumerator.Key));
                                    iterator.Set("value", (Unit)(enumerator.Value));
                                    return(new Unit(true));
                                }
                            }
                            else
                            {
                                return(new Unit(false));
                            }
                        }
                    };

                    iterator.Set("next", new IntrinsicUnit("table_iterator_next", next, 0));
                    return(new Unit(iterator));
                }

                methodTable.Set("numeric_iterator", new IntrinsicUnit("table_numeric_iterator", MakeNumericIterator, 1));

                //////////////////////////////////////////////////////
                Unit Indexes(VM vm)
                {
                    TableUnit this_table = vm.GetTable(0);
                    ListUnit  indexes    = new ListUnit(null);

                    foreach (Unit v in this_table.Map.Keys)
                    {
                        indexes.Elements.Add(v);
                    }

                    return(new Unit(indexes));
                }

                methodTable.Set("indexes", new IntrinsicUnit("table_indexes", Indexes, 1));

                //////////////////////////////////////////////////////
                Unit NumericIndexes(VM vm)
                {
                    TableUnit this_table = vm.GetTable(0);
                    ListUnit  indexes    = new ListUnit(null);

                    foreach (Unit v in this_table.Map.Keys)
                    {
                        if (Unit.IsNumeric(v))
                        {
                            indexes.Elements.Add(v);
                        }
                    }

                    return(new Unit(indexes));
                }

                methodTable.Set("numeric_indexes", new IntrinsicUnit("table_numeric_indexes", NumericIndexes, 1));

                //////////////////////////////////////////////////////
                Unit SetExtensionTable(VM vm)
                {
                    Unit      this_unit       = vm.GetUnit(0);
                    TableUnit extension_table = vm.GetTable(1);

                    if (extension_table.GetExtensionTable() != null)
                    {
                        throw new Exception("Extension Table has an Extention Table!");
                    }
                    if (this_unit.heapUnitValue.GetExtensionTable() != null)
                    {
                        throw new Exception("Table already has an Extention Table!");
                    }

                    this_unit.heapUnitValue.SetExtensionTable(extension_table);

                    return(new Unit(UnitType.Null));
                }

                methodTable.Set("set_extension_table", new IntrinsicUnit("table_set_extension_table", SetExtensionTable, 2));

                //////////////////////////////////////////////////////
                Unit UnsetExtensionTable(VM vm)
                {
                    Unit this_unit = vm.GetUnit(0);

                    this_unit.heapUnitValue.UnsetExtensionTable();

                    return(new Unit(UnitType.Null));
                }

                methodTable.Set("unset_extension_table", new IntrinsicUnit("table_unset_extension_table", UnsetExtensionTable, 1));

                //////////////////////////////////////////////////////
                Unit GetExtensionTable(VM vm)
                {
                    Unit      this_unit       = vm.GetUnit(0);
                    TableUnit extension_table = this_unit.heapUnitValue.GetExtensionTable();

                    if (extension_table == null)
                    {
                        return(new Unit(UnitType.Null));
                    }

                    return(new Unit(extension_table));
                }

                methodTable.Set("get_extension_table", new IntrinsicUnit("table_get_extension_table", GetExtensionTable, 1));

                //////////////////////////////////////////////////////
                Unit Merge(VM vm)
                {
                    TableUnit this_table    = vm.GetTable(0);
                    TableUnit merging_table = vm.GetTable(1);

                    foreach (KeyValuePair <Unit, Unit> u in merging_table.Map)
                    {
                        if (!this_table.Map.ContainsKey(u.Key))
                        {
                            this_table.Map.Add(u.Key, u.Value);
                        }
                    }
                    return(new Unit(UnitType.Null));
                }

                methodTable.Set("merge", new IntrinsicUnit("merge", Merge, 2));
            }
        }
Esempio n. 3
0
        private static void initMethodTable()
        {
            {
                //////////////////////////////////////////////////////
                Unit Clone(VM vm)
                {
                    ListUnit    this_list         = vm.GetList(0);
                    List <Unit> new_list_elements = new List <Unit>();

                    foreach (Unit v in this_list.Elements)
                    {
                        new_list_elements.Add(v);
                    }
                    ListUnit new_list = new ListUnit(new_list_elements);

                    new_list.MethodTable = this_list.MethodTable;

                    return(new Unit(new_list));
                }

                methodTable.Set("clone", new IntrinsicUnit("list_clone", Clone, 1));

                //////////////////////////////////////////////////////
                Unit Count(VM vm)
                {
                    ListUnit this_list = vm.GetList(0);
                    int      count     = this_list.Count;

                    return(new Unit(count));
                }

                methodTable.Set("count", new IntrinsicUnit("list_count", Count, 1));

                //////////////////////////////////////////////////////
                Unit Clear(VM vm)
                {
                    ListUnit this_list = vm.GetList(0);

                    this_list.Elements.Clear();
                    return(new Unit(UnitType.Null));
                }

                methodTable.Set("clear", new IntrinsicUnit("list_clear", Clear, 1));

                //////////////////////////////////////////////////////
                Unit ToString(VM vm)
                {
                    ListUnit this_list = vm.GetList(0);
                    bool     first     = true;
                    string   value     = "";

                    foreach (Unit v in this_list.Elements)
                    {
                        if (first)
                        {
                            value += System.Text.RegularExpressions.Regex.Unescape(v.ToString());
                            first  = false;
                        }
                        else
                        {
                            value += ", " + System.Text.RegularExpressions.Regex.Unescape(v.ToString());
                        }
                    }
                    return(new Unit(value));
                }

                methodTable.Set("to_string", new IntrinsicUnit("list_to_string", ToString, 1));

                //////////////////////////////////////////////////////
                Unit MakeIndexesIterator(VM vm)
                {
                    ListUnit this_list = vm.GetList(0);
                    int      i         = -1;

                    TableUnit iterator = new TableUnit(null);

                    Unit next(VM vm)
                    {
                        if (i < (this_list.Count - 1))
                        {
                            i++;
                            iterator.Set("key", i);
                            iterator.Set("value", this_list.Elements[i]);
                            return(new Unit(true));
                        }
                        return(new Unit(false));
                    };
                    iterator.Set("next", new IntrinsicUnit("list_index_iterator_next", next, 0));
                    return(new Unit(iterator));
                }

                methodTable.Set("index_iterator", new IntrinsicUnit("list_index_iterator", MakeIndexesIterator, 1));

                //////////////////////////////////////////////////////
                Unit MakeIterator(VM vm)
                {
                    ListUnit this_list = vm.GetList(0);
                    int      i         = -1;
                    Unit     value     = new Unit(UnitType.Null);

                    TableUnit iterator = new TableUnit(null);

                    Unit next(VM vm)
                    {
                        if (i < (this_list.Count - 1))
                        {
                            i++;
                            iterator.Set("value", this_list.Elements[i]);
                            return(new Unit(true));
                        }
                        return(new Unit(false));
                    };
                    iterator.Set("next", new IntrinsicUnit("list_iterator_next", next, 0));
                    return(new Unit(iterator));
                }

                methodTable.Set("iterator", new IntrinsicUnit("list_iterator", MakeIterator, 1));

                //////////////////////////////////////////////////////
                Unit Init(VM vm)
                {
                    ListUnit this_list = vm.GetList(0);
                    Integer  new_end   = vm.GetInteger(1);
                    int      size      = this_list.Count;

                    for (int i = size; i < new_end; i++)
                    {
                        this_list.Elements.Add(new Unit(UnitType.Null));
                    }

                    return(new Unit(UnitType.Null));
                }

                methodTable.Set("init", new IntrinsicUnit("list_init", Init, 2));

                //////////////////////////////////////////////////////
                Unit Push(VM vm)
                {
                    ListUnit this_list = vm.GetList(0);
                    Unit     value     = vm.GetUnit(1);

                    this_list.Elements.Add(value);

                    return(new Unit(UnitType.Null));
                }

                methodTable.Set("push", new IntrinsicUnit("list_push", Push, 2));

                //////////////////////////////////////////////////////
                Unit Pop(VM vm)
                {
                    ListUnit this_list = vm.GetList(0);
                    Float    value     = this_list.Elements[^ 1].floatValue;