コード例 #1
0
ファイル: parsing.cs プロジェクト: 0x00-pl/my_prog
        public static plt_node make_exp(ref string exp)
        {
            plt_node ret  = make_node(ref exp);
            // do with (
            if (ReferenceEquals(ret, left_brackets))
            {
                plt_list r = new plt_list();
                while (true)
                {
                    if (exp.Length <= 0) break;
                    ret = make_exp(ref exp);
                    if (ReferenceEquals(ret, right_brackets)) { break; }
                    r.add(ret);
                }
                return r;
            }
            //do with '
            if (ReferenceEquals(ret, plt_lambda.quote))
            {
                plt_list r = new plt_list();
                r.add(plt_lambda.quote);
                r.add(make_exp(ref exp));
               return r;
            }

            //do nothing
            return ret;
        }
コード例 #2
0
        public static plt_node make_exp(ref string exp)
        {
            plt_node ret = make_node(ref exp);

            // do with (
            if (ReferenceEquals(ret, left_brackets))
            {
                plt_list r = new plt_list();
                while (true)
                {
                    if (exp.Length <= 0)
                    {
                        break;
                    }
                    ret = make_exp(ref exp);
                    if (ReferenceEquals(ret, right_brackets))
                    {
                        break;
                    }
                    r.add(ret);
                }
                return(r);
            }
            //do with '
            if (ReferenceEquals(ret, plt_lambda.quote))
            {
                plt_list r = new plt_list();
                r.add(plt_lambda.quote);
                r.add(make_exp(ref exp));
                return(r);
            }

            //do nothing
            return(ret);
        }
コード例 #3
0
        public static plt_node quote_node(plt_node n)
        {
            plt_list ret = new plt_list();

            ret.add(plt_lambda.quote);
            ret.add(n);
            return(ret);
        }
コード例 #4
0
ファイル: Form1.cs プロジェクト: 0x00-pl/my_prog
        private void button1_Click(object sender, EventArgs e)
        {
            plt_list static_env = new plt_list();
            static_env.add("+", new plt_lambda_add());

            string input = parsing.format_string(@"((lambda (a) (+ a 1)) 10)");
            plt_node ret = parsing.make_exp(ref input);
            parsing.set_all_symbol_env(ret as plt_list, static_env);
            ret = plt_node.eval_node(ret);

            textBox1.Text = ret.ToString();
        }
コード例 #5
0
        private void button1_Click(object sender, EventArgs e)
        {
            plt_list static_env = new plt_list();

            static_env.add("+", new plt_lambda_add());

            string   input = parsing.format_string(@"((lambda (a) (+ a 1)) 10)");
            plt_node ret   = parsing.make_exp(ref input);

            parsing.set_all_symbol_env(ret as plt_list, static_env);
            ret = plt_node.eval_node(ret);

            textBox1.Text = ret.ToString();
        }
コード例 #6
0
        public override void mix_env(plt_list arg)
        {
            if (arg_name == null)
            {
                return;
            }
            plt_list env = new plt_list();

            for (int i = 0; i < arg_name._member.Count; i++)
            {
                string   name  = ((plt_symbol)arg_name.get_member(i)).name;
                plt_node value = arg.get_member(i + 1);
                env.set_member(name, value);
            }
            update_all_symbol(exp as plt_list, env);
        }
コード例 #7
0
 public static void set_all_symbol_env(plt_list e, plt_list env)
 {
     if (e == null)
     {
         return;
     }
     foreach (plt_node i in e._member)
     {
         plt_symbol if_symbol = i as plt_symbol;
         if (if_symbol != null)
         {
             if (env.name_map.ContainsKey(if_symbol.name))
             {
                 if_symbol.point_to = env.get_member(if_symbol.name);
             }
             continue;;
         }
         set_all_symbol_env(i as plt_list, env);
     }
 }
コード例 #8
0
 public override void mix_env(plt_list arg)
 {
     a = (plt_int)arg.get_member(1);
     b = (plt_int)arg.get_member(2);
 }
コード例 #9
0
ファイル: base.cs プロジェクト: 0x00-pl/my_prog
        public override plt_tail eval()
        {
            if (_member.Count == 0) return plt_tail.nil;
            plt_node afirst = plt_node.eval_node(_member[0]);
            if (afirst == null) return plt_tail.nil;

            {//特殊的函数

                //特殊情况-不解释参数
                if (ReferenceEquals(afirst, plt_lambda.quote))
                {
                    if (_member.Count < 2) return plt_tail.nil;
                    return new plt_tail(_member[1], false);
                }
                if (ReferenceEquals(afirst, plt_lambda.make_lambda))
                {
                    plt_list_lambda ret = new plt_list_lambda();
                    ret.arg_name = _member[1] as plt_list;
                    ret.exp = _member[2];
                    return new plt_tail(ret, false);
                }
                if (ReferenceEquals(afirst, plt_lambda.cond))
                {
                    for (int i = 1; i+1 < _member.Count; i+=2) {
                        plt_node _if = plt_node.eval_node(_member[i]);
                        if (_if != null) {
                            return new plt_tail(_member[i + 1], true);
                        }
                    }
                }
                //宏 不解释参数
                plt_lambda lismacro = afirst as plt_lambda;
                if (lismacro != null && lismacro.ismacro)
                {
                    lismacro.mix_env(this);
                    return lismacro.eval();
                }
            }
            plt_list args_eval = new plt_list();
            args_eval.add(afirst);
            for (int i = 1; i < _member.Count; i++)
            {
                args_eval.add(plt_node.eval_node(_member[i]));
            }
            plt_lambda func = afirst as plt_lambda;
            if (func != null)
            {
                func.mix_env(args_eval);
            }
            return afirst.eval();
        }
コード例 #10
0
ファイル: base.cs プロジェクト: 0x00-pl/my_prog
 public virtual void mix_env(plt_list arg)
 {
 }
コード例 #11
0
ファイル: parsing.cs プロジェクト: 0x00-pl/my_prog
 public static void set_all_symbol_env(plt_list e,plt_list env)
 {
     if (e == null) { return; }
     foreach (plt_node i in e._member)
     {
         plt_symbol if_symbol = i as plt_symbol;
         if (if_symbol != null)
         {
             if (env.name_map.ContainsKey(if_symbol.name))
                 if_symbol.point_to = env.get_member(if_symbol.name);
             continue; ;
         }
         set_all_symbol_env(i as plt_list, env);
     }
 }
コード例 #12
0
ファイル: parsing.cs プロジェクト: 0x00-pl/my_prog
 public static plt_node quote_node(plt_node n)
 {
     plt_list ret = new plt_list();
     ret.add(plt_lambda.quote);
     ret.add(n);
     return ret;
 }
コード例 #13
0
ファイル: base.cs プロジェクト: 0x00-pl/my_prog
 public virtual void mix_env(plt_list arg)
 {
 }
コード例 #14
0
ファイル: base.cs プロジェクト: 0x00-pl/my_prog
        public override plt_tail eval()
        {
            if (_member.Count == 0)
            {
                return(plt_tail.nil);
            }
            plt_node afirst = plt_node.eval_node(_member[0]);

            if (afirst == null)
            {
                return(plt_tail.nil);
            }


            {//特殊的函数
                //特殊情况-不解释参数
                if (ReferenceEquals(afirst, plt_lambda.quote))
                {
                    if (_member.Count < 2)
                    {
                        return(plt_tail.nil);
                    }
                    return(new plt_tail(_member[1], false));
                }
                if (ReferenceEquals(afirst, plt_lambda.make_lambda))
                {
                    plt_list_lambda ret = new plt_list_lambda();
                    ret.arg_name = _member[1] as plt_list;
                    ret.exp      = _member[2];
                    return(new plt_tail(ret, false));
                }
                if (ReferenceEquals(afirst, plt_lambda.cond))
                {
                    for (int i = 1; i + 1 < _member.Count; i += 2)
                    {
                        plt_node _if = plt_node.eval_node(_member[i]);
                        if (_if != null)
                        {
                            return(new plt_tail(_member[i + 1], true));
                        }
                    }
                }
                //宏 不解释参数
                plt_lambda lismacro = afirst as plt_lambda;
                if (lismacro != null && lismacro.ismacro)
                {
                    lismacro.mix_env(this);
                    return(lismacro.eval());
                }
            }
            plt_list args_eval = new plt_list();

            args_eval.add(afirst);
            for (int i = 1; i < _member.Count; i++)
            {
                args_eval.add(plt_node.eval_node(_member[i]));
            }
            plt_lambda func = afirst as plt_lambda;

            if (func != null)
            {
                func.mix_env(args_eval);
            }
            return(afirst.eval());
        }