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; } } }
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()); } }) } }; }