Esempio n. 1
0
        private Met Ast()
        {
            var met = new Met(this);

            met.Type = Met.MetType.List;
            var tree = new List <Met>();

            met.Mets = tree;
            while (true)
            {
                if (P >= List.Count)
                {
                    Debug.LogError("tree err");
                    return(null);
                }

                var m = List[P];
                P++;
                if (m == "(")
                {
                    var newMet = Ast();
                    tree.Add(newMet);
                }

                if (m == ")")
                {
                    return(met);
                }

                if (m != "(" && m != ")")
                {
                    var notListMet = new Met(this);
                    tree.Add(notListMet);
                    var mList = m.ToCharArray();
                    if (mList[0] == '\'' && mList[mList.Length - 1] == '\'')
                    {
                        notListMet.Type = Met.MetType.StringMet;
                        var s = "";
                        for (var i = 0; i < mList.Length; i++)
                        {
                            if (i != 0 && i != mList.Length - 1)
                            {
                                s = s + mList[i];
                            }
                        }

                        notListMet.MetContent = s;
                        continue;
                    }

                    notListMet.Type       = Met.MetType.BaseMat;
                    notListMet.MetContent = m;
                }
            }
        }
Esempio n. 2
0
        public VoidLisp()
        {
            Functions = new Dictionary <string, LispFunction> {
                {
                    "runlist",
                    new LispFunction(li => {
                        var listMet  = new Met(this);
                        listMet.Type = Met.MetType.List;
                        listMet.Mets = new List <Met>();
                        foreach (var met in li)
                        {
                            listMet.Mets.Add(met.Exec());
                        }
                        listMet.MetContent = "runlist";
                        return(listMet);
                    })
                },
                {
                    "list",
                    new LispFunction(li => {
                        var listMet        = new Met(this);
                        listMet.Type       = Met.MetType.List;
                        listMet.Mets       = li;
                        listMet.MetContent = "list";
                        return(listMet);
                    })
                },
                { "eval", new LispFunction(li => Eval(li[0].MetContent)) },
                { "exec", new LispFunction(li => {
                        return(li[0].Exec());
                    }) },
                {
                    "let",
                    new LispFunction(li => {
                        Values.Add(li[0].MetContent, li[1]);
                        var met        = new Met(this);
                        met.Type       = Met.MetType.BaseMat;
                        met.MetContent = "T";
                        return(met);
                    })
                },
                {
                    "print", new LispFunction(l => {
                        var s = "";
                        foreach (var met in l)
                        {
                            s = s + " " + met.Exec().MetContent;
                        }
                        Debug.Log(s);
                        var resmet        = new Met(this);
                        resmet.MetContent = s;
                        resmet.Type       = Met.MetType.BaseMat;
                        return(resmet);
                    })
                },
                {
                    "quote", new LispFunction(metList => {
                        var met  = new Met(this);
                        met.Type = Met.MetType.List;
                        met.Mets = metList;
                        return(met);
                    })
                },
                {
                    "+", new LispFunction(metList => {
                        var sum = 0f;
                        foreach (var met in metList)
                        {
                            var n = float.Parse(met.Exec().MetContent);
                            sum   = n + sum;
                        }

                        var m        = new Met(this);
                        m.Type       = Met.MetType.BaseMat;
                        m.MetContent = sum.ToString();
                        return(m);
                    })
                },
                {
                    "*", new LispFunction(metList => {
                        var sum = 1f;
                        foreach (var met in metList)
                        {
                            var n = float.Parse(met.Exec().MetContent);
                            sum   = n * sum;
                        }

                        var m        = new Met(this);
                        m.Type       = Met.MetType.BaseMat;
                        m.MetContent = sum.ToString();
                        return(m);
                    })
                },
                {
                    "-", new LispFunction(metList => {
                        var result = float.Parse(metList[0].Exec().MetContent);
                        for (var i = 1; i < metList.Count; i++)
                        {
                            var n  = float.Parse(metList[i].Exec().MetContent);
                            result = result - n;
                        }

                        var m        = new Met(this);
                        m.Type       = Met.MetType.BaseMat;
                        m.MetContent = result.ToString();
                        return(m);
                    })
                },
                {
                    "/", new LispFunction(metList => {
                        var result = float.Parse(metList[0].Exec().MetContent);
                        for (var i = 1; i < metList.Count; i++)
                        {
                            var n  = float.Parse(metList[i].Exec().MetContent);
                            result = result / n;
                        }

                        var m        = new Met(this);
                        m.Type       = Met.MetType.BaseMat;
                        m.MetContent = result.ToString();
                        return(m);
                    })
                },
                {
                    "loop", new LispFunction(li => {
                        return(null);
                    })
                },
                {
                    "openMsgW", new LispFunction(l => {
                        UIUtils.SimpleMsgWindow(l[0].MetContent, () => {
                        }, () => {
                        });
                        var m  = new Met(this);
                        m.Type = Met.MetType.BaseMat;

                        return(m);
                    })
                },
                {
                    "if",
                    new LispFunction(li => {
                        if (li[0].Exec().MetContent == "T")
                        {
                            return(li[1].Exec());
                        }
                        else
                        {
                            return(li[2].Exec());
                        }
                    })
                }
            };
        }