Esempio n. 1
0
 internal KecaknoahArray(List <KecaknoahReference> arr)
 {
     Type   = TypeCode.Object;
     array  = arr;
     length = KecaknoahReference.CreateRightReference(arr.Count);
     InitializeMembers();
 }
Esempio n. 2
0
        private KecaknoahReference find, each, filter, map, reduce;//, first, last;

        internal KecaknoahArray(int[] dim)
        {
            Type      = TypeCode.Object;
            ExtraType = "Array";
            array     = new List <KecaknoahReference>();
            length    = KecaknoahReference.CreateRightReference(dim[0]);
            InitializeMembers();
            for (int i = 0; i < dim[0]; i++)
            {
                array.Add(new KecaknoahReference {
                    IsLeftValue = true, RawObject = KecaknoahNil.Instance
                });
            }
            if (dim.Length == 1)
            {
                return;
            }
            for (int i = 0; i < array.Count; i++)
            {
                array[i] = new KecaknoahReference {
                    IsLeftValue = true, RawObject = new KecaknoahArray(dim.Skip(1).ToArray())
                }
            }
            ;
        }
Esempio n. 3
0
 private void InitializeMembers()
 {
     each   = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceEach));
     find   = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceFind));
     filter = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceFilter));
     map    = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceMap));
     reduce = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceReduce));
 }
Esempio n. 4
0
 /// <summary>
 /// 新しいインスタンスを初期化します。
 /// </summary>
 /// <param name="info"></param>
 public KecaknoahInteropClassObject(KecaknoahInteropClassInfo info)
 {
     Class = info;
     foreach (var i in Class.classMethods)
     {
         methods[i.Name] = (KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(KecaknoahNil.Instance, i.Body)));
     }
 }
Esempio n. 5
0
 /// <summary>
 /// 新しいインスタンスを初期化します。
 /// </summary>
 /// <param name="info"></param>
 public KecaknoahScriptClassObject(KecaknoahScriptClassInfo info)
 {
     Class       = info;
     Constructor = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, CreateInstance));
     foreach (var i in Class.classMethods)
     {
         methods[i.Name] = (KecaknoahReference.CreateRightReference(new KecaknoahScriptFunction(KecaknoahNil.Instance, i)));
     }
 }
        /// <summary>
        /// 呼び出します。
        /// </summary>
        /// <param name="context"></param>
        /// <param name="args">引数</param>
        /// <returns>返り値</returns>
        protected internal override KecaknoahFunctionResult Call(KecaknoahContext context, KecaknoahObject[] args)
        {
            var sf = new KecaknoahStackFrame(context, BaseMethod.Codes);

            sf.Locals["self"] = KecaknoahReference.CreateRightReference(Instance);
            sf.Arguments      = args;
            var r = sf.Resume();

            return(new KecaknoahFunctionResult(sf.ReturningObject, r));
        }
Esempio n. 7
0
        /// <summary>
        /// メソッドを登録します。
        /// </summary>
        /// <param name="name">メソッド名</param>
        /// <param name="func">
        /// 登録するメソッドのデリゲート。
        /// インスタンスと引数配列が渡されます。
        /// </param>
        public void AddFunction(string name, Action <KecaknoahObject, KecaknoahObject[]> func)
        {
            KecaknoahInteropDelegate wp =
                (c, s, a) =>
            {
                func(s, a);
                return(KecaknoahNil.Instance.NoResume());
            };

            funcs[name] = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, wp));
        }
Esempio n. 8
0
 private void RegisterInstanceFunction()
 {
     add       = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceAdd));
     insert    = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceInsert));
     each      = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceEach));
     remove_at = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceRemoveAt));
     remove_by = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceRemoveBy));
     filter    = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceFilter));
     map       = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceMap));
     reduce    = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceReduce));
 }
Esempio n. 9
0
 internal KecaknoahArray(List <KecaknoahObject> arr)
 {
     Type  = TypeCode.Object;
     array = new List <KecaknoahReference>();
     foreach (var i in arr)
     {
         array.Add(new KecaknoahReference {
             IsLeftValue = true, RawObject = i
         });
     }
     length = KecaknoahReference.CreateRightReference(arr.Count);
     InitializeMembers();
 }
Esempio n. 10
0
        /// <summary>
        /// 指定された名前のメンバーへの参照を取得します。
        /// 「参照」というのは右辺値・左辺値どちらにもなりうる<see cref="KecaknoahReference"/>を差し、
        /// インスタンスごとに1つずつ(呼ばれる毎にnewしない)である必要があります。
        /// ここで返されるべき参照は
        /// ・インスタンスメソッド
        /// ・プロパティ
        /// などです。どちらもフィールドに<see cref="KecaknoahReference"/>のインスタンスを確保して
        /// switch分岐でそれらを返すことが推奨されます。
        /// </summary>
        /// <param name="name">メンバー名</param>
        /// <returns></returns>
        protected internal override KecaknoahReference GetMemberReference(string name)
        {
            switch (name)
            {
            case nameof(each): return(each);

            case nameof(remove): return(remove);

            case nameof(has_key): return(has_key);

            case "length": return(KecaknoahReference.CreateRightReference(dict.Count.AsKecaknoahInteger()));
            }
            return(base.GetMemberReference(name));
        }
Esempio n. 11
0
        /// <summary>
        /// 指定された名前のメンバーへの参照を取得します。
        /// 「参照」というのは右辺値・左辺値どちらにもなりうる<see cref="KecaknoahReference"/>を差し、
        /// インスタンスごとに1つずつ(呼ばれる毎にnewしない)である必要があります。
        /// ここで返されるべき参照は
        /// ・インスタンスメソッド
        /// ・プロパティ
        /// などです。どちらもフィールドに<see cref="KecaknoahReference"/>のインスタンスを確保して
        /// switch分岐でそれらを返すことが推奨されます。
        /// </summary>
        /// <param name="name">メンバー名</param>
        /// <returns></returns>
        protected internal override KecaknoahReference GetMemberReference(string name)
        {
            switch (name)
            {
            case nameof(add): return(add);

            case nameof(insert): return(insert);

            case nameof(each): return(each);

            case nameof(remove_at): return(remove_at);

            case nameof(remove_by): return(remove_by);

            case nameof(map): return(map);

            case nameof(reduce): return(reduce);

            case nameof(filter): return(filter);

            case "length": return(KecaknoahReference.CreateRightReference(list.Count.AsKecaknoahInteger()));
            }
            return(base.GetMemberReference(name));
        }
Esempio n. 12
0
 /// <summary>
 /// 新しいインスタンスを生成します。
 /// </summary>
 public KecaknoahString()
 {
     Type      = TypeCode.String;
     Replace   = KecaknoahReference.CreateRightReference(this, InstanceReplace);
     Substring = KecaknoahReference.CreateRightReference(this, InstanceSubstring);
 }
Esempio n. 13
0
 /// <summary>
 /// メソッドを登録します。
 /// </summary>
 /// <param name="name">メソッド名</param>
 /// <param name="func">登録するメソッドのデリゲート</param>
 public void AddFunction(string name, KecaknoahInteropDelegate func)
 {
     funcs[name] = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, func));
 }
Esempio n. 14
0
        /// <summary>
        /// メソッドを登録します。
        /// </summary>
        /// <param name="name">メソッド名</param>
        /// <param name="func">
        /// 登録するメソッドのデリゲート。
        /// インスタンスと引数が渡されます。
        /// </param>
        public void AddFunction(string name, Func <KecaknoahObject, KecaknoahObject[], string> func)
        {
            KecaknoahInteropDelegate wp = (c, s, a) => func(s, a).AsKecaknoahString().NoResume();

            funcs[name] = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, wp));
        }
Esempio n. 15
0
 /// <summary>
 /// <see cref="KecaknoahInteropDelegate"/>への参照を生成します。
 /// </summary>
 /// <param name="dele"></param>
 /// <param name="self">属するインスタンス</param>
 /// <returns></returns>
 public static KecaknoahReference CreateReference(this KecaknoahInteropDelegate dele, KecaknoahObject self) => KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(self, dele));
Esempio n. 16
0
 private static KecaknoahReference InstanceHash(KecaknoahObject self) => KecaknoahReference.CreateRightReference(self, (ctx, s, args) => s.GetHashCode().AsKecaknoahInteger().NoResume());
Esempio n. 17
0
 private static KecaknoahReference InstanceToString(KecaknoahObject self) => KecaknoahReference.CreateRightReference(self, (ctx, s, args) => s.ToString().AsKecaknoahString().NoResume());
Esempio n. 18
0
        private KecaknoahFunctionResult InstanceReduce(KecaknoahContext ctx, KecaknoahObject self, KecaknoahObject[] args)
        {
            var result = array.Aggregate((p, q) => KecaknoahReference.CreateRightReference(args[0].Call(ctx, new[] { p.RawObject, q.RawObject }).ReturningObject));

            return(result.RawObject.NoResume());
        }
Esempio n. 19
0
 private void RegisterInstanceFunction()
 {
     each    = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceEach));
     remove  = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceRemove));
     has_key = KecaknoahReference.CreateRightReference(new KecaknoahInteropFunction(this, InstanceHasKey));
 }