Example #1
0
        public void SetSource(string source, int offset)
        {
            //System.Diagnostics.Debug.WriteLine(string.Format("Scan line {0}", _currentLine));

            ScanLexer lexer = GetLexer();

            if (lexer != null)
            {
                if (_currentLine >= 0 && source.Length > 0)
                {
                    if (_source != null && _source.ProjectInfo != null)
                    {
                        var ret = _source.ProjectInfo.Engine.GetActiveEnv(_source.FileIndex, _currentLine + 1);

                        if (ret.Field0 != null)
                        {
                            _env = ret.Field0;
                            _type = ret.Field1;
                        }
                    }
                }

                lexer.SetLine(_currentLine + 1, source, offset, _env, _type);
            }
        }
Example #2
0
        public void SetSource(string source, int offset)
        {
            //System.Diagnostics.Debug.WriteLine(string.Format("Scan line {0}", _currentLine));

            ScanLexer lexer = GetLexer();

            if (lexer != null)
            {
                if (_currentLine >= 0 && source.Length > 0)
                {
                    if (_source != null && _source.ProjectInfo != null)
                    {
                        var ret = _source.ProjectInfo.Engine.GetActiveEnv(_source.FileIndex, _currentLine + 1);

                        if (ret.Field0 != null)
                        {
                            _env  = ret.Field0;
                            _type = ret.Field1;
                        }
                    }
                }

                lexer.SetLine(_currentLine + 1, source, offset, _env, _type);
            }
        }
Example #3
0
 public KeyValuePair <object, Continue> Eval(Env e, Continue k)
 {
     return(RightNode.Eval(e, v => {
         GlobalEnv.Instance()[Index] = v;
         return k(null);
     }));
 }
Example #4
0
 public static string GetImageUrl(this HtmlHelper helper, string pictureName)
 {
     if (string.IsNullOrEmpty(pictureName))
     {
         return("");
     }
     return(GlobalEnv.GetImageUrls(pictureName));
 }
Example #5
0
    /**
     * @Function: Card Function
     *
     * @Author: Minjung KIM
     * @Date: 2020.Mar.25
     * @History:
     *  - 2020.05.25 Minjung KIM: initial commit
     *  - 2020.05.29 Minjung KIM: ADD credit exceeded case
     *  - 2020.06.16 Minjung KIM: Block duplicate tagging
     *  - 2020.07.01 Minjung KIM: Add discount_yn
     *  - 2020.07.03 Minjung KIM: Add sound effect
     */
    void OnTriggerExit(Collider collision)
    {
        int    total            = Int32.Parse(total_amount.text);
        string tag              = collision.gameObject.tag;
        string discount_auth_yn = GameObject.Find("v_discount_auth_yn").GetComponent <Text>().text;
        string trying_to_pay    = GameObject.Find("v_trying_to_pay_yn").GetComponent <Text>().text;

        if (card_tag == false && !tag.Equals("Untagged") && tag.Equals("card") && trying_to_pay.Equals("Y"))
        {
            M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_ACT, GlobalEnv.EVENT_TYPE_PAY, tag, "discount_yn:" + discount_auth_yn);
            card_tag = true;

            // -----------------------
            // FAIL
            // -----------------------
            if (total > GlobalEnv.ReturnBudget(lang.ToString()))
            {
                M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_ACT, GlobalEnv.EVENT_TYPE_EXCEEDED, total.ToString(), "discount_yn:" + discount_auth_yn);

                result_message.text     = LangText.alert_err[lang];
                result_message.color    = Color.red;
                result_background.color = Color.yellow;
                M_EventLogger.EventLogging(GlobalEnv.ACTOR_SYSTEM, GlobalEnv.EVENT_CATE_SYS_MSG, GlobalEnv.EVENT_TYPE_RESULT_MSG, total.ToString(), "discount_yn:" + discount_auth_yn);
                SoundManager.instance.PlaySound(GlobalEnv.SOUND_ERROR, lang);

                card_tag = false;
                screen5.gameObject.SetActive(false);

                // release button enabled option
                GameObject.Find("v_trying_to_pay_yn").GetComponent <Text>().text    = "N";
                GameObject.Find("btn_pay").GetComponent <Button>().interactable     = true;
                GameObject.Find("btn_uncheck").GetComponent <Button>().interactable = true;
                GameObject.Find("btn_pay").GetComponent <BoxCollider>().enabled     = true;
                GameObject.Find("btn_uncheck").GetComponent <BoxCollider>().enabled = true;

                // -----------------------
                // SUCC
                // -----------------------
            }
            else
            {
                GameObject.Find("v_trying_to_pay_yn").GetComponent <Text>().text = "N";
                screen5.gameObject.SetActive(false);
                M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_ACT, GlobalEnv.EVENT_TYPE_END, total.ToString(), "discount_yn:" + discount_auth_yn);

                result_message.text     = LangText.alert_succ[lang];
                result_message.color    = Color.blue;
                result_background.color = Color.white;
                M_EventLogger.EventLogging(GlobalEnv.ACTOR_SYSTEM, GlobalEnv.EVENT_CATE_SYS_MSG, GlobalEnv.EVENT_TYPE_RESULT_MSG, total.ToString(), "discount_yn:" + discount_auth_yn);
                SoundManager.instance.PlaySound(GlobalEnv.SOUND_SUCC, lang);

                Invoke("ChangeScreen1toScreen5After2s", 2f);
            }
        }
    }
Example #6
0
     protected override void OnAfterUsingDirectiveParse(
   Location location,
   list<string> name,
   list<Location> nameLocations,
   string alias,
   Location aliasLocation,
   GlobalEnv beforeEnv,
   GlobalEnv afterEnv
 )
     {
         // do not notify Manager
     }
Example #7
0
 protected override void OnAfterUsingDirectiveParse(
     Location location,
     list <string> name,
     list <Location> nameLocations,
     string alias,
     Location aliasLocation,
     GlobalEnv beforeEnv,
     GlobalEnv afterEnv
     )
 {
     // do not notify Manager
 }
Example #8
0
        public object Interpret(object exp)
        {
            IASTNode node = ASTCompiler.Compile(null, ListProcess.TransformLibraryForms(exp));

            GlobalEnv.Instance().ReserveVariables(SymbolTable.GetGlobalSymbolCount());

            var lambda = new ASTNode_Lambda {
                bodyNode = node, localVarCount = 0, freeAddresses = new List <FreeAddress>(),
            };

            return(mStack.CallScriptProcedure(new ScriptProcedure(null, CompileToByteCode(lambda)), new List <object> {
            }));
        }
Example #9
0
     protected override void OnAfterNamespaceParse(
   Location location,
   list<string> name,
   list<Location> nameLocations,
   GlobalEnv outsideEnv,
   GlobalEnv insideEnv,
   Location headerLocation,
   Location bodyOpenTokenLocation,
   Location bodyCloseTokenLocation
 )
     {
         // do not notify Manager
     }
Example #10
0
 protected override void OnAfterNamespaceParse(
     Location location,
     list <string> name,
     list <Location> nameLocations,
     GlobalEnv outsideEnv,
     GlobalEnv insideEnv,
     Location headerLocation,
     Location bodyOpenTokenLocation,
     Location bodyCloseTokenLocation
     )
 {
     // do not notify Manager
 }
Example #11
0
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("The process is:");
            sb.AppendLine(Process.ToString());
            if (!GlobalEnv.IsEmpty())
            {
                sb.AppendLine();
                sb.AppendLine("The environment is:");
                sb.AppendLine(GlobalEnv.ToString());
            }
            return(sb.ToString());
        }
Example #12
0
        //=================================================================

        static object ForceEval(Env env, object exp)
        {
            IASTNode node = Compile(null, TransformLibraryForm(exp));

            GlobalEnv.Instance().ExtendTo(GlobalSymbolTable.Instance().GetSymbolCount());

            KeyValuePair <object, Continue> p = node.Eval(env, (v => new KeyValuePair <object, Continue>(v, null)));;

            while (p.Value != null)
            {
                p = p.Value(p.Key);
            }
            return(p.Key);
        }
Example #13
0
        public override string GetID()
        {
            if (ConfigID == null)
            {
                if (GlobalEnv.IsEmpty())
                {
                    ConfigID = Process.ProcessID;
                }
                else
                {
                    ConfigID = GlobalEnv.GetID(Process.ProcessID);
                }
            }

            //if we can make sure ConfigID is not changed, we can calculate one time only
            System.Diagnostics.Debug.Assert(ConfigID == Process.ProcessID || ConfigID == GlobalEnv.GetID(Process.ProcessID));

            return(ConfigID);
        }
Example #14
0
    // /* 1p: what is your goal? */ , {
    //   "친구들과 야외에서 샌드위치를 먹기 위해 쇼핑을 끝냈고, 당신은 결제만 남았습니다! \n친구가 보내준 메시지를 확인하여 성공적으로 계산을 완료해 주세요."
    //  ,"Vous venez de terminer vos achats pour manger des sandwichs à l'extérieur avec vos amis et vous n'avez laissé que le processus de paiement maintenant! Veuillez vérifier le message que votre ami a envoyé et effectuer le paiement à l'aide de la machine de paiement automatique."
    // ,"You just finished shopping to eat sandwiches outside with your friends and you just left only the payment process now! Please check the message that your friend sent and complete the make a payment using the self-checkout machine."}

    // ------------------------------------
    // MART SCENE: Notification
    // ------------------------------------
    public static string martNoti_msg2(int lang, string gameMode, string discountCode)
    {
        string n_lang   = lang.ToString();
        string msg      = "";
        string v_budget = GlobalEnv.ReturnBudget(n_lang).ToString();

        if (GlobalEnv.GAMEMODE_START.Equals(gameMode))
        {
            if (GlobalEnv.KR.Equals(n_lang))
            {
                msg = "미안. 할인코드 알려주는걸 깜빡했어. \n여기 상점 할인코드가 있는데\n 내일 만료되니까 꼭 사용해야 해. \n코드는 " + discountCode + " 야. 까먹지마! " + discountCode + " \n그리고 카드 한도 " + v_budget + "원 밖에 안남았어!";
            }
            else if (GlobalEnv.FR.Equals(n_lang))
            {
                msg = "";
            }
            else if (GlobalEnv.EN.Equals(n_lang))
            {
                msg = "Sorry. I've forgotton, \nI have a discount code for this shop and it will expire tomorrow. \nYou should use it. The code is " + discountCode + ". Do not forget " + discountCode + "!\n And I've only " + v_budget + "Euros left on a card!";
            }
        }
        else
        {
            discountCode = GlobalEnv.DISCOUNT_CODE_TEST;
            if (GlobalEnv.KR.Equals(n_lang))
            {
                msg = "[연습모드] 테스트 할인코드는 " + discountCode + "입니다.";
            }
            else if (GlobalEnv.FR.Equals(n_lang))
            {
                msg = "[FRANCE-TEST] TEST CODE IS" + discountCode + ".";
            }
            else if (GlobalEnv.EN.Equals(n_lang))
            {
                msg = "[TEST] TEST CODE IS" + discountCode + ".";
            }
        }
        return(msg);
    }
Example #15
0
        public override IEnumerable <ConfigurationBase> MakeOneMove()
        {
            var nextPNConfigurations = new List <PNConfiguration>();

            foreach (var t in Process.Transitions)
            {
                if (t.GuardCondition != null)
                {
                    ExpressionValue v = EvaluatorDenotational.Evaluate(t.GuardCondition, GlobalEnv);
                    if (!(v as BoolConstant).Value)
                    {
                        continue;
                    }

                    //transition can fire --> move one step
                    var newGlobleEnv = GlobalEnv.GetVariableClone();
                    EvaluatorDenotational.Evaluate(t.ProgramBlock, newGlobleEnv);

                    var name = t.Event.GetEventName(GlobalEnv);
                    var id   = t.Event.GetEventID(GlobalEnv);

                    var newConfiguration = new PNConfiguration(Process, id, name, newGlobleEnv, IsDataOperation);
                    nextPNConfigurations.Add(newConfiguration);
                }
                else
                {
                    //SOME THING WRONG HERE:
                    System.Diagnostics.Debug.WriteLine("Transition don't have guardCondition/fired condition.");
                }
            }

            if (nextPNConfigurations.Count == 0)
            {
                IsDeadLock = true;
            }

            return(nextPNConfigurations);
        }
    /**
     * Update Screen information
     */
    void Update()
    {
        int p_discount = 0;

        // Applying discount code
        string discount_auth_yn = GameObject.Find("v_discount_auth_yn").GetComponent <Text>().text;

        if (discount_auth_yn.Equals("Y"))
        {
            p_discount = GlobalEnv.ReturnDiscountPrice(lang);
            // v_discount.color = Color.red;
        }

        // Update counting
        GameObject.Find("v_scanned_item_cnt").GetComponent <Text>().text = scanned_list.Count.ToString();
        string v_current_canvas = GameObject.Find("v_current_canvas").GetComponent <Text>().text;

        // Update item info
        if (update_tf == true && (v_current_canvas.Equals("screen1") || v_current_canvas.Equals("screen2")))
        {
            // 1. Reset all information on the self-checkout screen
            ClearAllInformation();

            // 3. Update items list
            int i       = 1;
            int p_total = 0;
            foreach (KeyValuePair <string, string> kv in scanned_list)
            {
                string o_item_name  = kv.Key;
                string o_item_qty   = kv.Value;
                string o_item_price = GlobalEnv.ReturnItemPrice(o_item_name, lang);

                // Notify the first calling
                if (firstItem_tf == false && i == 1)
                {
                    v_firstItem_yn.text = "Y";
                    firstItem_tf        = true;
                }

                // GameObject.Find("checkbox"+i).GetComponent<Toggle>().interactable = true;
                GameObject.Find("checkbox" + i).GetComponent <Toggle>().isOn = true;
                GameObject.Find("item_name" + i.ToString()).GetComponent <TextMeshProUGUI>().text  = LangText.ReturnItemName(o_item_name, lang);
                GameObject.Find("item_qty" + i.ToString()).GetComponent <TextMeshProUGUI>().text   = o_item_qty;
                GameObject.Find("item_price" + i.ToString()).GetComponent <TextMeshProUGUI>().text = o_item_price;
                p_total += Int32.Parse(o_item_qty) * Int32.Parse(o_item_price);
                i++;
            }
            v_total.text = p_total.ToString();

            // 4. Update total price Info
            int total_price = (p_total - p_discount);
            if (total_price < 0)
            {
                total_price = 0;
            }
            total_amount.text = total_price.ToString();

            M_EventLogger.EventLogging(GlobalEnv.ACTOR_SYSTEM, GlobalEnv.EVENT_CATE_SCREEN, GlobalEnv.EVENT_TYPE_SCREEN_UPDATE, "UPDATE", "Screen information Updated");
        }

        // Update
        update_tf = false;
    }
    /**
     * @Function: Item Scanner Function
     *
     * @Author: Minjung KIM
     * @Date: 2020.Mar.17
     * @History:
     *  - 2020.03.17 Minjung KIM: 최초 작성 (1개 타입의 종류만 되도록 개발)
     *  - 2020.03.18 Minjung KIM: 여러 개의 오브젝트가 스캔되도록 개발
     *  - 2020.04.19 Minjung KIM: Block scan interaction when the canvas = screen2 and discount_auth_yn = Y
     *  - 2020.05.03 Minjugn KIM: Allow scan interaction when the user touched cancel buttton
     *  - 2020.05.23 Minjung KIM: Add Event Log
     *  - 2020.06.01 Minjung KIM: Bugfix qty Counting Error
     *  - 2020.07.01 Minjung KIM: Allow the scan anytime
     *  - 2020.07.08 Minjung KIM: Add scanned item name to result_message
     */
    void OnTriggerEnter(Collider collision)
    {
        string o_item_code = collision.gameObject.name;  // unique item code: ex) A1
        string o_item_name = collision.gameObject.tag;   // item name: ex) Apple

        string current_canvas = GameObject.Find("v_current_canvas").GetComponent <Text>().text;
        string trying_to_pay  = GameObject.Find("v_trying_to_pay_yn").GetComponent <Text>().text;

        // ----------------------------------
        // 1. Scan to Add items
        // ----------------------------------
        if (!o_item_name.Equals("Untagged") && !o_item_name.Equals("card") && !o_item_name.Equals("left_cellphone") && current_canvas.Equals("screen1") && !trying_to_pay.Equals("Y"))
        {
            //Debug.Log("Add ScannerEvent() o_item_code:" + o_item_code);
            //Debug.Log("Add ScannerEvent() o_item_name:" + o_item_name);

            // 1-1 Allow only unscanned item!
            // This means that firstly we check the item unique code from duplicate_scanned_list for block the duplicate scan.
            if (dupcheck_scanned_list.ContainsKey(o_item_code) == false)
            {
                // 1. Update scanned_list quantity then Add item code in duplicate_scanned_list (for blocking the duplicate scans)
                int qty = 1;
                if (scanned_list.ContainsKey(o_item_name))
                {
                    qty = Int32.Parse(scanned_list[o_item_name]) + 1;
                }
                scanned_list[o_item_name] = qty.ToString();
                dupcheck_scanned_list.Add(o_item_code, o_item_name);
                canceled_list.Remove(o_item_code);
                SoundManager.instance.PlaySound(GlobalEnv.SOUND_SCANNED, 99);

                // 2. Add Event log
                M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_ACT, GlobalEnv.EVENT_TYPE_SCAN_ADD, o_item_name, o_item_code);
                update_tf = true;

                // 3. Update user message
                screen1_result_message.text  = LangText.ReturnItemName(o_item_name, lang) + LangText.scan_added[lang];
                screen1_result_message.color = Color.blue;
                result_background.color      = Color.white;
                M_EventLogger.EventLogging(GlobalEnv.ACTOR_SYSTEM, GlobalEnv.EVENT_CATE_SYS_MSG, GlobalEnv.EVENT_TYPE_SCAN_ADD, "screen1_result_message", LangText.ReturnItemName(o_item_name, lang) + LangText.scan_added[lang]);
            }
            else
            {
                // Todo : 이미있는 아이템을 또 태그하려고했을 때
                M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_ACT, GlobalEnv.EVENT_TYPE_SCAN_DUP_ADD, o_item_name, o_item_code);
                // screen1_result_message.text = LangText.ReturnItemName(o_item_name, lang) + "는 이미 스캔된 아이템입니다.";
                // screen1_result_message.color = Color.red;
                // result_background.color = Color.white;
                // SOUND
                // ADMIN LOG
            }

            // ----------------------------------
            // 2. Scan to remove items
            // ----------------------------------
        }
        else if (!o_item_name.Equals("Untagged") && !o_item_name.Equals("card") && !o_item_name.Equals("left_cellphone") && current_canvas.Equals("screen2"))
        {
            //Debug.Log("Remove ScannerEvent() o_item_code:" + o_item_code);
            //Debug.Log("Remove ScannerEvent() o_item_name:" + o_item_name);

            screen2_result_message.text = "-"; //initializing

            // 2-1. Allow only scanned items & Block that already canceled items
            Debug.Log("CHECK scanned list:" + scanned_list.ContainsKey(o_item_name));
            Debug.Log("CHECK canceled list:" + !canceled_list.ContainsKey(o_item_code));
            if (scanned_list.ContainsKey(o_item_name) == true && canceled_list.ContainsKey(o_item_code) == false)
            {
                // 1. initializing the result message
                screen1_result_message.text  = "-";
                screen1_result_message.color = Color.black;

                // 2. Update scanned_list quantity then Remove item code in duplicate_scanned_list (for allow the scans again)
                int o_qty = Int32.Parse(scanned_list[o_item_name]) - 1;
                if (o_qty <= 0)
                {
                    scanned_list.Remove(o_item_name);
                }
                else
                {
                    scanned_list[o_item_name] = o_qty.ToString();
                }
                dupcheck_scanned_list.Remove(o_item_code);
                canceled_list.Add(o_item_code, o_item_name);
                SoundManager.instance.PlaySound(GlobalEnv.SOUND_SCANNED, 99);

                // 3. Add Event log
                M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_ACT, GlobalEnv.EVENT_TYPE_SCAN_REMOVE, o_item_name, o_item_code);

                // 4. Update removed item information with item name and price.
                screen2_result_message.text  = LangText.ReturnItemName(o_item_name, lang) + " ( " + GlobalEnv.ReturnItemPrice(o_item_name, lang) + " " + LangText.returnCurrency[lang] + " )" + LangText.scan_removed[lang];
                screen2_result_message.color = Color.blue;
                result_background.color      = Color.white;
                M_EventLogger.EventLogging(GlobalEnv.ACTOR_SYSTEM, GlobalEnv.EVENT_CATE_SYS_MSG, GlobalEnv.EVENT_TYPE_SCAN_REMOVE, "screen2_result_message", LangText.ReturnItemName(o_item_name, lang) + " ( " + GlobalEnv.ReturnItemPrice(o_item_name, lang) + " " + LangText.returnCurrency[lang] + " )" + LangText.scan_removed[lang]);

                // 6. Automatically change the screen
                screen2_btn_home.GetComponent <Button>().interactable = false;
                screen2_btn_home.GetComponent <BoxCollider>().enabled = false;
                Invoke("ChangeScreen2toScreen1After3s", 3f);
            }
            else
            {
                // Todo - 이미 제거하거나 없는 아이템을 제거하려고 했을 때
                M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_ACT, GlobalEnv.EVENT_TYPE_SCAN_DUP_REMOVE, o_item_name, o_item_code);
                SoundManager.instance.PlaySound(GlobalEnv.SOUND_ERROR, lang);
                screen2_result_message.text  = LangText.ReturnItemName(o_item_name, lang) + "는 없는 아이템입니다.";
                screen2_result_message.color = Color.red;
                result_background.color      = Color.white;
                M_EventLogger.EventLogging(GlobalEnv.ACTOR_ADMIN, GlobalEnv.EVENT_CATE_SYS_MSG, GlobalEnv.EVENT_TYPE_SCAN_DUP_REMOVE, "screen2_result_message", LangText.ReturnItemName(o_item_name, lang) + "는 없는 아이템입니다.");
            }
        }
    }
    /**
     * @ Function : Screen4 Interaction for discount code
     *
     * @ Author : Minjung KIM
     * @ Date : 2020.04.19
     * @ History :
     *   - 2020.04.19 Minjung Kim : Initial commit
     *   - 2020.05.03 Minjugn Kim : Remove checkbox interaction and Add cancel interacton
     *   - 2020.05.23 Minjung Kim : Add Event Log
     *   - 2020.06.16 Minjung Kim : Clear the disocunt code input field
     **/
    private void OnTriggerExit(Collider other)
    {
        if (touch == true)
        {
            touch = false;

            string key = currentBtnObj.tag;

            // Add Event log
            M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_ACT, GlobalEnv.EVENT_TYPE_BTN_TOUCH, key, "");

            // ----------------------------------
            // BTN_BACK
            // ----------------------------------
            if (key.Equals("btn_back"))
            {
                string org_text = input_discount_code.text;
                if (org_text.Length > 0)
                {
                    string new_text = org_text.Substring(0, org_text.Length - 1);
                    input_discount_code.text = new_text;
                    M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_SYS_MSG, GlobalEnv.EVENT_TYPE_SCREEN_UPDATE, "input_discount_code", new_text);
                }

                // ----------------------------------
                // BTN_APPLY
                // ----------------------------------
            }
            else if (key.Equals("btn_apply"))
            {
                result_message.text = "";
                int v_dc = GlobalEnv.ReturnDiscountPrice(lang);
                v_discount.text = v_dc.ToString();

                int total = Int32.Parse(screen1_total_amount.text);

                // ----------------------------------
                // REAL MODE
                // ----------------------------------
                if (gameMode.Equals(GlobalEnv.GAMEMODE_START))
                {
                    // ----------------------------------
                    // CHECKING DISCOUNT CODE
                    // ----------------------------------
                    string v_level = GameObject.Find("v_level").GetComponent <Text>().text;
                    if (GlobalEnv.DISCOUNT_CODE_EASY.Equals(input_discount_code.text) ||
                        GlobalEnv.DISCOUNT_CODE_NORMAL.Equals(input_discount_code.text) ||
                        GlobalEnv.DISCOUNT_CODE_HARD.Equals(input_discount_code.text))
                    {
                        screen1_total_amount.text = (total - v_dc).ToString();
                        M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_ACT, GlobalEnv.EVENT_TYPE_CODE_SUCC, (total - v_dc).ToString(), "screen4");

                        result_message.text     = LangText.screen4_succ_dc[lang];
                        result_message.color    = Color.blue;
                        result_background.color = Color.white;
                        M_EventLogger.EventLogging(GlobalEnv.ACTOR_SYSTEM, GlobalEnv.EVENT_CATE_SYS_MSG, GlobalEnv.EVENT_TYPE_CODE_SUCC, "result_message", "screen4:" + LangText.screen4_succ_dc[lang]);
                        SoundManager.instance.PlaySound(GlobalEnv.SOUND_SUCC, lang);

                        Invoke("ChangeScreen4toScreen1After1s", 1f);
                    }
                    else
                    {
                        input_discount_code.text = ""; // clear the input field
                        errors       += 1;
                        v_errors.text = errors.ToString();
                        M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_ACT, GlobalEnv.EVENT_TYPE_CODE_FAIL, input_discount_code.text, "errors:" + errors);

                        // If the user does 3 errors, they will receive a full discount code.
                        result_message.text     = LangText.screen4_fail_dc[lang];
                        result_message.color    = Color.red;
                        result_background.color = Color.yellow;
                        M_EventLogger.EventLogging(GlobalEnv.ACTOR_SYSTEM, GlobalEnv.EVENT_CATE_SYS_MSG, GlobalEnv.EVENT_TYPE_CODE_FAIL, "result_message", "screen4:" + LangText.screen4_fail_dc[lang]);
                        SoundManager.instance.PlaySound(GlobalEnv.SOUND_ERROR, lang);
                    }

                    // ----------------------------------
                    // TEST MODE
                    // ----------------------------------
                }
                else
                {
                    if (GlobalEnv.DISCOUNT_CODE_TEST.Equals(input_discount_code.text))
                    {
                        screen1_total_amount.text = (total - GlobalEnv.ReturnDiscountPrice(lang)).ToString();
                        M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_ACT, GlobalEnv.EVENT_TYPE_CODE_SUCC, (total - v_dc).ToString(), "screen4");

                        result_message.text     = LangText.screen4_succ_dc[lang];
                        result_message.color    = Color.blue;
                        result_background.color = Color.white;
                        M_EventLogger.EventLogging(GlobalEnv.ACTOR_SYSTEM, GlobalEnv.EVENT_CATE_SYS_MSG, GlobalEnv.EVENT_TYPE_CODE_SUCC, "result_message", "screen4: " + LangText.screen4_succ_dc[lang]);
                        SoundManager.instance.PlaySound(GlobalEnv.SOUND_SUCC, lang);

                        Invoke("ChangeScreen4toScreen1After1s", 1f);
                    }
                    else
                    {
                        input_discount_code.text = ""; // clear the input field
                        errors       += 1;
                        v_errors.text = errors.ToString();
                        M_EventLogger.EventLogging(GlobalEnv.ACTOR_USER, GlobalEnv.EVENT_CATE_ACT, GlobalEnv.EVENT_TYPE_CODE_FAIL, input_discount_code.text, "errors:" + errors);

                        // If the user does 3 errors, they will receive a full discount code.
                        result_message.text     = LangText.screen4_fail_dc[lang];
                        result_message.color    = Color.red;
                        result_background.color = Color.yellow;
                        SoundManager.instance.PlaySound(GlobalEnv.SOUND_ERROR, lang);
                        M_EventLogger.EventLogging(GlobalEnv.ACTOR_SYSTEM, GlobalEnv.EVENT_CATE_SYS_MSG, GlobalEnv.EVENT_TYPE_CODE_FAIL, "result_message", "screen4:" + LangText.screen4_fail_dc[lang]);
                    }
                }

                // ----------------------------------
                // KEYBOARD BUTTON
                // ----------------------------------
            }
            else if (key.Equals("Key_1"))
            {
                input_discount_code.text += "1";
            }
            else if (key.Equals("Key_2"))
            {
                input_discount_code.text += "2";
            }
            else if (key.Equals("Key_3"))
            {
                input_discount_code.text += "3";
            }
            else if (key.Equals("Key_4"))
            {
                input_discount_code.text += "4";
            }
            else if (key.Equals("Key_5"))
            {
                input_discount_code.text += "5";
            }
            else if (key.Equals("Key_6"))
            {
                input_discount_code.text += "6";
            }
            else if (key.Equals("Key_7"))
            {
                input_discount_code.text += "7";
            }
            else if (key.Equals("Key_8"))
            {
                input_discount_code.text += "8";
            }
            else if (key.Equals("Key_9"))
            {
                input_discount_code.text += "9";
            }
            else if (key.Equals("Key_0"))
            {
                input_discount_code.text += "0";
            }
            else if (key.Equals("Key_A"))
            {
                input_discount_code.text += "A";
            }
            else if (key.Equals("Key_B"))
            {
                input_discount_code.text += "B";
            }
            else if (key.Equals("Key_C"))
            {
                input_discount_code.text += "C";
            }
            else if (key.Equals("Key_D"))
            {
                input_discount_code.text += "D";
            }
            else if (key.Equals("Key_E"))
            {
                input_discount_code.text += "E";
            }
            else if (key.Equals("Key_F"))
            {
                input_discount_code.text += "F";
            }
            else if (key.Equals("Key_G"))
            {
                input_discount_code.text += "G";
            }
            else if (key.Equals("Key_H"))
            {
                input_discount_code.text += "H";
            }
            else if (key.Equals("Key_I"))
            {
                input_discount_code.text += "I";
            }
            else if (key.Equals("Key_J"))
            {
                input_discount_code.text += "J";
            }
            else if (key.Equals("Key_K"))
            {
                input_discount_code.text += "K";
            }
            else if (key.Equals("Key_L"))
            {
                input_discount_code.text += "L";
            }
            else if (key.Equals("Key_M"))
            {
                input_discount_code.text += "M";
            }
            else if (key.Equals("Key_N"))
            {
                input_discount_code.text += "N";
            }
            else if (key.Equals("Key_O"))
            {
                input_discount_code.text += "O";
            }
            else if (key.Equals("Key_P"))
            {
                input_discount_code.text += "P";
            }
            else if (key.Equals("Key_Q"))
            {
                input_discount_code.text += "Q";
            }
            else if (key.Equals("Key_R"))
            {
                input_discount_code.text += "R";
            }
            else if (key.Equals("Key_S"))
            {
                input_discount_code.text += "S";
            }
            else if (key.Equals("Key_T"))
            {
                input_discount_code.text += "T";
            }
            else if (key.Equals("Key_U"))
            {
                input_discount_code.text += "U";
            }
            else if (key.Equals("Key_V"))
            {
                input_discount_code.text += "V";
            }
            else if (key.Equals("Key_W"))
            {
                input_discount_code.text += "W";
            }
            else if (key.Equals("Key_X"))
            {
                input_discount_code.text += "X";
            }
            else if (key.Equals("Key_Y"))
            {
                input_discount_code.text += "Y";
            }
            else if (key.Equals("Key_Z"))
            {
                input_discount_code.text += "Z";
            }
        }
        currentBtnObj.GetComponent <Image>().color = org_normalColor;
    }
Example #19
0
 public KeyValuePair <object, Continue> Eval(Env e, Continue k)
 {
     return(k(GlobalEnv.Instance()[Index]));
 }
Example #20
0
        static void SetupGlobalEnv()
        {
            Dictionary <string, object> builtinVars = new Dictionary <string, object>()
            {
                { "true", true },
                { "false", false },
                { "else", true },
                { "null", null },
            };

            Dictionary <string, Procedure> builtinProcedures = new Dictionary <string, Procedure>()
            {
                { "not", (args, k) => k(!(bool)args[0]) },
                { "identity", (args, k) => k(args[0]) },
                { "sqr", (args, k) => {
                      if (args[0] is BigInteger)
                      {
                          var a = (BigInteger)args[0]; return(k(a * a));
                      }
                      else
                      {
                          var a = (decimal)args[0]; return(k(a * a));
                      }
                  } },
                { "+", (args, k) => {
                      if (args[0] is decimal || args[1] is decimal)
                      {
                          return(k(CastToDecimal(args[0]) + CastToDecimal(args[1])));
                      }
                      return(k((BigInteger)args[0] + (BigInteger)args[1]));
                  } },
                { "-", (args, k) => {
                      if (args[0] is decimal || args[1] is decimal)
                      {
                          return(k(CastToDecimal(args[0]) - CastToDecimal(args[1])));
                      }
                      return(k((BigInteger)args[0] - (BigInteger)args[1]));
                  } },
                { "*", (args, k) => {
                      if (args[0] is decimal || args[1] is decimal)
                      {
                          return(k(CastToDecimal(args[0]) * CastToDecimal(args[1])));
                      }
                      return(k((BigInteger)args[0] * (BigInteger)args[1]));
                  } },
                { "/", (args, k) => {
                      if (args[0] is decimal || args[1] is decimal)
                      {
                          return(k(CastToDecimal(args[0]) / CastToDecimal(args[1])));
                      }
                      return(k((BigInteger)args[0] / (BigInteger)args[1]));
                  } },
                { "quotient", (args, k) => {
                      if (args[0] is decimal || args[1] is decimal)
                      {
                          return(k((BigInteger)(CastToDecimal(args[0]) / CastToDecimal(args[1]))));
                      }
                      return(k((BigInteger)args[0] / (BigInteger)args[1]));
                  } },
                { "remainder", (args, k) => {
                      if (args[0] is decimal || args[1] is decimal)
                      {
                          return(k(CastToDecimal(args[0]) % CastToDecimal(args[1])));
                      }
                      return(k((BigInteger)args[0] % (BigInteger)args[1]));
                  } },
                { "=", (args, k) => k(args[0].Equals(args[1])) },
                { "<", (args, k) => k((args[0] as IComparable).CompareTo(args[1]) < 0) },
                { "<=", (args, k) => k((args[0] as IComparable).CompareTo(args[1]) <= 0) },
                { ">", (args, k) => k((args[0] as IComparable).CompareTo(args[1]) > 0) },
                { ">=", (args, k) => k((args[0] as IComparable).CompareTo(args[1]) >= 0) },
                { "eq?", (args, k) => k(object.ReferenceEquals(args[0], args[1])) },

                { "cons", (args, k) => k(new Pair()
                    {
                        Car = args[0], Cdr = args[1]
                    }) },
                { "car", (args, k) => k(((Pair)args[0]).Car) },
                { "cdr", (args, k) => k(((Pair)args[0]).Cdr) },
                { "drop", (args, k) => {
                      Pair l = (Pair)args[0]; int n = (int)(BigInteger)args[1];
                      for (; n > 0; --n)
                      {
                          l = (Pair)l.Cdr;
                      }
                      return(k(l));
                  } },
                { "length", (args, k) => {
                      int n = 0;
                      for (Pair l = (Pair)args[0]; l != null; ++n, l = (Pair)l.Cdr)
                      {
                          ;
                      }
                      return(k(n));
                  } },
                { "append", (args, k) => {
                      var l = PairToList((Pair)args[0]);
                      l.InsertRange(l.Count, PairToList((Pair)args[1]));
                      return(k(ListToPair(l)));
                  } },
                { "empty?", (args, k) => k(args[0] == null) },

                { "pretty-print", (args, k) => {
                      PrintPairExp(args[0]);
                      return(k(null));
                  } },
                { "display", (args, k) => {
                      PrintListExp(PairExpToListExp(args[0]));
                      return(k(null));
                  } },
                { "current-inexact-milliseconds", (args, k) => {
                      long now;
                      QueryPerformanceCounter(out now);
                      return(k((decimal)(now - sTimerStart) * 1000 / sTimerFreq));
                  } },
                { "exit", (args, k) => {
                      Environment.Exit(0);
                      return(k(null));
                  } },
                { "random", (args, k) => k((BigInteger)sRandom.Next((int)(BigInteger)args[0])) },
                { "eval", (args, k) => k(ForceEval(null, PairExpToListExp(args[0]))) },
                { "call/cc", (args, k) => {
                      return(((Procedure)args[0])(new List <object>()
                        {
                            (Procedure)((args2, k2) => new KeyValuePair <object, Continue>(args2[0], k)),
                        }, k));
                  } },
            };

            GlobalEnv.Instance().ExtendTo(builtinVars.Count + builtinProcedures.Count);
            foreach (var nameValue in builtinVars)
            {
                int index = GlobalSymbolTable.Instance().LookupOrDefine(nameValue.Key);
                GlobalEnv.Instance()[index] = nameValue.Value;
            }
            foreach (var nameValue in builtinProcedures)
            {
                int index = GlobalSymbolTable.Instance().LookupOrDefine(nameValue.Key);
                GlobalEnv.Instance()[index] = nameValue.Value;
            }
        }
Example #21
0
    public void Start()
    {
        text_before.text = LangText.martText_self_before[lang];
        text_after.text  = LangText.martText_self_after[lang];
        text_scan.text   = LangText.martText_self_scan[lang];
        text_card.text   = LangText.martText_self_card[lang];

        // level
        string level         = GameObject.Find("v_level").GetComponent <Text>().text;
        string discount_code = GlobalEnv.ReturnDiscountCode(level);

        text_subtitle.text = LangText.martNoti_msg2(lang, gameMode, discount_code);

        // screen1
        if (GlobalEnv.KR.Equals(lang.ToString()))
        {
            text_screen1_currency1.text = "W";
            text_screen1_currency2.text = "W";
            text_screen1_currency3.text = "W";
        }
        text_screen1_result.text   = LangText.screen1_scanning[lang];
        text_screen1_name.text     = LangText.screen1_text_itemName[lang];
        text_screen1_qty.text      = LangText.screen1_text_itemQty[lang];
        text_screen1_price.text    = LangText.screen1_text_itemPrice[lang];
        text_screen1_total.text    = LangText.screen1_text_total[lang];
        text_screen1_discount.text = LangText.screen1_text_discount[lang];
        text_screen1_cancel.text   = LangText.screen1_button_cancel[lang];
        text_screen1_pay.text      = LangText.screen1_button_pay[lang];

        // screen2
        text_screen2_instruction.text = LangText.screen2_instruction[lang];
        text_screen2_home.text        = LangText.screen2_btn_home[lang];

        // screen3
        text_screen3_result.text = LangText.screen3_asking_discount_code[lang];
        text_screen3_yes.text    = LangText.screen3_btn_yes[lang];
        text_screen3_no.text     = LangText.screen3_btn_no[lang];

        // screen4
        text_screen4_e_result.text    = LangText.screen4_enter_the_dc[lang];
        text_screen4_e_apply.text     = LangText.screen4_button_apply[lang];
        text_screen4_e_backspace.text = LangText.screen4_button_backspace[lang];
        text_screen4_n_result.text    = LangText.screen4_enter_the_dc[lang];
        text_screen4_n_apply.text     = LangText.screen4_button_apply[lang];
        text_screen4_n_backspace.text = LangText.screen4_button_backspace[lang];
        text_screen4_h_result.text    = LangText.screen4_enter_the_dc[lang];
        text_screen4_h_apply.text     = LangText.screen4_button_apply[lang];
        text_screen4_h_backspace.text = LangText.screen4_button_backspace[lang];

        // screen5
        text_screen5_btn_back.text          = LangText.screen2_btn_home[lang];
        text_screen5_tyring_to_pay_msg.text = LangText.alert_tryingToPay[lang];

        // screen6
        text_screen6_result.text = LangText.screen5_result[lang];

        // Material rollbacks
        screen.SetTexture("_EmissionMap", basic.texture);

        // Set Home button
        if (gameMode.Equals(GlobalEnv.GAMEMODE_START))
        {
            btn_home.SetActive(false);
        }
    }
Example #22
0
 public static int Luaopen_unity(IntPtr state)
 {
     GlobalEnv.NewLib(state, unitylib);
     return(1);
 }
Example #23
0
        private ByteCodeInterpreter()
        {
            Utils.QueryPerformanceCounter(out mTimerStart);
            Utils.QueryPerformanceFrequency(out mTimerFreq);

            Dictionary <string, object> builtinVars = new Dictionary <string, object>()
            {
                { "true", true },
                { "false", false },
                { "else", true },
                { "null", null },
            };

            Dictionary <string, HostProcedure> builtinProcedures = new Dictionary <string, HostProcedure>()
            {
                { "not", (stack, ret) => stack[ret] = !(bool)stack[ret + 1] },
                { "identity", (stack, ret) => stack[ret] = stack[ret + 1] },
                { "sqr", (stack, ret) => { var a = (INumber)stack[ret + 1]; stack[ret] = a.Mul(a); } },
                { "+", (stack, ret) => stack[ret] = ((INumber)stack[ret + 1]).Add((INumber)stack[ret + 2]) },
                { "-", (stack, ret) => stack[ret] = ((INumber)stack[ret + 1]).Sub((INumber)stack[ret + 2]) },
                { "*", (stack, ret) => stack[ret] = ((INumber)stack[ret + 1]).Mul((INumber)stack[ret + 2]) },
                { "/", (stack, ret) => stack[ret] = ((INumber)stack[ret + 1]).Div((INumber)stack[ret + 2]) },
                { "quotient", (stack, ret) => stack[ret] = ((INumber)stack[ret + 1]).Div((INumber)stack[ret + 2]).CastToInteger() },
                { "remainder", (stack, ret) => stack[ret] = ((INumber)stack[ret + 1]).Mod((INumber)stack[ret + 2]) },
                { "=", (stack, ret) => stack[ret] = stack[ret + 1].Equals(stack[ret + 2]) },
                { "<", (stack, ret) => stack[ret] = (stack[ret + 1] as IComparable).CompareTo(stack[ret + 2]) < 0 },
                { "<=", (stack, ret) => stack[ret] = (stack[ret + 1] as IComparable).CompareTo(stack[ret + 2]) <= 0 },
                { ">", (stack, ret) => stack[ret] = (stack[ret + 1] as IComparable).CompareTo(stack[ret + 2]) > 0 },
                { ">=", (stack, ret) => stack[ret] = (stack[ret + 1] as IComparable).CompareTo(stack[ret + 2]) >= 0 },
                { "eq?", (stack, ret) => stack[ret] = object.ReferenceEquals(stack[ret + 1], stack[ret + 2]) },

                { "cons", (stack, ret) => stack[ret] = new Pair()
                  {
                      Car = stack[ret + 1], Cdr = stack[ret + 2]
                  } },
                { "car", (stack, ret) => stack[ret] = ((Pair)stack[ret + 1]).Car },
                { "cdr", (stack, ret) => stack[ret] = ((Pair)stack[ret + 1]).Cdr },
                { "drop", (stack, ret) => {
                      Pair l = (Pair)stack[ret + 1]; int n = ((NumberInteger)stack[ret + 2]).value;
                      for (; n > 0; --n)
                      {
                          l = (Pair)l.Cdr;
                      }
                      stack[ret] = l;
                  } },
                { "length", (stack, ret) => {
                      int n = 0;
                      for (Pair l = (Pair)stack[ret + 1]; l != null; ++n, l = (Pair)l.Cdr)
                      {
                          ;
                      }
                      stack[ret] = Number.Create(n);
                  } },
                { "append", (stack, ret) => {
                      var l = ListProcess.PairToList((Pair)stack[ret + 1]);
                      l.InsertRange(l.Count, ListProcess.PairToList((Pair)stack[ret + 2]));
                      stack[ret] = ListProcess.ListToPair(l);
                  } },
                { "empty?", (stack, ret) => stack[ret] = stack[ret + 1] == null },

                { "pretty-print", (stack, ret) => {
                      ListProcess.PrintPairExp(stack[ret + 1]);
                      stack[ret] = null;
                  } },
                { "display", (stack, ret) => {
                      ListProcess.PrintListExp(ListProcess.PairExpToListExp(stack[ret + 1]));
                      stack[ret] = null;
                  } },
                { "current-inexact-milliseconds", (stack, ret) => {
                      long now;
                      Utils.QueryPerformanceCounter(out now);
                      stack[ret] = Number.Create((decimal)(now - mTimerStart) * 1000 / mTimerFreq);
                  } },
                { "exit", (stack, ret) => {
                      Environment.Exit(0);
                      stack[ret] = null;
                  } },
                { "random", (stack, ret) => stack[ret] = Number.Create(mRandom.Next(((NumberInteger)stack[ret + 1]).value)) },
                { "eval", (stack, ret) => stack[ret] = Interpret(ListProcess.PairExpToListExp(stack[ret + 1])) },
            };

            GlobalEnv.Instance().ReserveVariables(builtinVars.Count + builtinProcedures.Count);
            foreach (KeyValuePair <string, object> kv in builtinVars)
            {
                GlobalEnv.Instance().variables[SymbolTable.DefineOrGetGlobalSymbol(kv.Key).index] = kv.Value;
            }
            foreach (KeyValuePair <string, HostProcedure> kv in builtinProcedures)
            {
                GlobalEnv.Instance().variables[SymbolTable.DefineOrGetGlobalSymbol(kv.Key).index] = kv.Value;
            }
        }
Example #24
0
            public object CallScriptProcedure(ScriptProcedure procedure, List <object> actuals)
            {
                int startFrame     = frames.Count;
                int startEvalStack = evalStack.Count;

                {
                    Env localEnv = new Env {
                        prevEnv = null, variables = new object[procedure.meta.localVarCount],
                    };
                    for (int i = 0; i < actuals.Count; ++i)
                    {
                        localEnv.variables[i] = actuals[i];
                    }
                    frames.Push(new StackFrame {
                        procedure = procedure, localEnv = localEnv, pc = 0,
                    });
                }

Label_PeekFrame:
                while (frames.Count > startFrame)
                {
                    if (frames.Count > MaxStackFrameCount)
                    {
                        throw new Exception("Stack frame overflow: " + MaxStackFrameCount);
                    }
                    if (evalStack.Count > MaxEvalStackDepth)
                    {
                        throw new Exception("Eval stack overflow: " + MaxEvalStackDepth);
                    }

                    StackFrame    frame           = frames.Peek();
                    object[]      localVaraibles  = frame.localEnv.variables;
                    object[][]    freeVariables   = frame.procedure.freeVariables;
                    List <object> globalVariables = GlobalEnv.Instance().variables;
                    object[]      literals        = frame.procedure.meta.literals;
                    int[]         byteCodes       = frame.procedure.meta.byteCodes;

                    int pc = frame.pc;
                    while (pc < byteCodes.Length)
                    {
                        switch (byteCodes[pc])
                        {
                        case ByteCodeEnum.PUSH_LITERAL: {
                            evalStack.Add(literals[byteCodes[pc + 1]]);
                            pc += 2;
                        }
                        break;

                        case ByteCodeEnum.PUSH_LOCAL: {
                            evalStack.Add(localVaraibles[byteCodes[pc + 1]]);
                            pc += 2;
                        }
                        break;

                        case ByteCodeEnum.POP_LOCAL: {
                            localVaraibles[byteCodes[pc + 1]] = evalStack.Last();
                            evalStack.RemoveAt(evalStack.Count - 1);
                            pc += 2;
                        }
                        break;

                        case ByteCodeEnum.PUSH_GLOBAL: {
                            evalStack.Add(globalVariables[byteCodes[pc + 1]]);
                            pc += 2;
                        }
                        break;

                        case ByteCodeEnum.POP_GLOBAL: {
                            globalVariables[byteCodes[pc + 1]] = evalStack.Last();
                            evalStack.RemoveAt(evalStack.Count - 1);
                            pc += 2;
                        }
                        break;

                        case ByteCodeEnum.PUSH_FREE: {
                            evalStack.Add(freeVariables[byteCodes[pc + 1]][byteCodes[pc + 2]]);
                            pc += 3;
                        }
                        break;

                        case ByteCodeEnum.POP_FREE: {
                            freeVariables[byteCodes[pc + 1]][byteCodes[pc + 2]] = evalStack.Last();
                            evalStack.RemoveAt(evalStack.Count - 1);
                            pc += 3;
                        }
                        break;

                        case ByteCodeEnum.POP1: {
                            evalStack.RemoveAt(evalStack.Count - 1);
                            pc += 1;
                        }
                        break;

                        case ByteCodeEnum.CJMP: {
                            var b = (bool)evalStack.Last();
                            evalStack.RemoveAt(evalStack.Count - 1);
                            if (b)
                            {
                                pc = byteCodes[pc + 1];
                            }
                            else
                            {
                                pc += 2;
                            }
                        }
                        break;

                        case ByteCodeEnum.JMP: {
                            pc = byteCodes[pc + 1];
                        }
                        break;

                        case ByteCodeEnum.PUSH_SCRIPT_PROCEDURE: {
                            evalStack.Add(new ScriptProcedure(frame.localEnv, (ScriptProcedureMeta)literals[byteCodes[pc + 1]]));
                            pc += 2;
                        }
                        break;

                        case ByteCodeEnum.TAIL_CALL:
                        case ByteCodeEnum.CALL: {
                            int    actualCount    = byteCodes[pc + 1];
                            object p              = evalStack[evalStack.Count - actualCount - 1];
                            var    hostProcuedure = p as HostProcedure;
                            if (hostProcuedure != null)
                            {
                                hostProcuedure(evalStack, evalStack.Count - actualCount - 1);
                                evalStack.RemoveRange(evalStack.Count - actualCount, actualCount);
                                pc += 2;
                            }
                            else
                            {
                                if (byteCodes[pc] == ByteCodeEnum.TAIL_CALL)
                                {
                                    frames.Pop();
                                }
                                else
                                {
                                    frame.pc = pc + 2;
                                }

                                var scriptProcedure = (ScriptProcedure)p;
                                Env localEnv        = new Env {
                                    prevEnv = scriptProcedure.freeEnv, variables = new object[scriptProcedure.meta.localVarCount]
                                };
                                for (int i = 0; i < actualCount; ++i)
                                {
                                    localEnv.variables[i] = evalStack[evalStack.Count - actualCount + i];
                                }
                                evalStack.RemoveRange(evalStack.Count - actualCount - 1, actualCount + 1);

                                frames.Push(new StackFrame {
                                        procedure = scriptProcedure, localEnv = localEnv, pc = 0
                                    });
                                goto Label_PeekFrame;
                            }
                        }
                        break;

                        default:
                            throw new Exception("Unkown bytecode :" + byteCodes[pc]);
                        }
                    }

                    frames.Pop();
                }

                object r = evalStack[startEvalStack];

                evalStack.RemoveAt(startEvalStack);
                return(r);
            }