public override BaseAtom Run(string list) { string lambdaContent = LispUtil.SplitInAtom(list); bool shouldRunResult = false; if (!LispUtil.IsAtom(lambdaContent)) { lambdaContent = LispUtil.RemoveBracket(lambdaContent); shouldRunResult = true; } else { lambdaContent = list; shouldRunResult = false; } // 解析得到LambdaAtom string[] args = GetArgs(lambdaContent); LambdaAtom lambdaAtom = new LambdaAtom(Parser, args[0], args[1]); // @TODO: 如果list后面没有内容,则直接返回这个LambdaAtom BaseAtom result = lambdaAtom; if (shouldRunResult) { result = lambdaAtom.Run(list); } return(result); }
/// <summary> /// 检查是否条件表达式 /// </summary> private bool CheckIsCond(string key) { string keyFirstArgs = LispUtil.SplitInAtom(key); if (keyFirstArgs.Equals("cond")) { return(true); } return(false); }
private void ParseCondArg(string condArg) { string temp = LispUtil.RemoveBracket(condArg); string[] argContent = LispUtil.SplitInAtomAll(temp); string argCond = Parser.ParseAndGetResult(argContent[0]) as string; ArgResult = argContent[1]; ArgIsTrue = argCond.Equals("True"); }
static void eval(string filename, bool isInclude) { try { var exp = (isInclude) ? new ConvSExp().include(filename) : new ConvSExp().import(filename); var ret = LispUtil.eval(exp); Console.WriteLine(ret); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
/// <summary> /// 检查是否含有lambda表达式 /// </summary> private bool CheckIsLambdaAtom(string key) { if (!LispUtil.IsAtom(key)) { key = LispUtil.RemoveBracket(key); } string keyFirstArgs = LispUtil.SplitInAtom(key); if (keyFirstArgs.Equals("lambda")) { return(true); } return(false); }
public override BaseAtom Run(string list) { BaseAtom result = null; string resultToBind = null; string[] args = LispUtil.SplitInAtomAll(list); for (int i = 1; i < args.Length; i++) { // 将每个CondArg交给CondArgsParser处理 CondArgsParser condArgsParser = new CondArgsParser(Parser, args[i]); // 如果CondArgsParser得到的结果是True,说明使用此CondArg的列表 if (condArgsParser.ArgIsTrue) { resultToBind = condArgsParser.ArgResult; break; } } result = Parser.ParseAndGetAtom(resultToBind); return(result); }
/// <summary> /// 解析得到一个原子 /// </summary> public BaseAtom ParseAndGetAtom(string list) { // 判断list是否为原子,如果是原子,则直接从原子库中获取 if (LispUtil.IsAtom(list)) { // 如果RuntimeAtomStack中有,则先绑定 if (RuntimeAtomStack.IsHaveSignalValue(list)) { list = RuntimeAtomStack.GetSignalValue(list); } BaseAtom atom = AtomStorage[list]; return(atom); } // 否则是列表,则调用对应的原子进行运算 else { list = LispUtil.RemoveBracket(list); string key = LispUtil.SplitInAtom(list); BaseAtom atom = AtomStorage[key]; return(atom.Run(list)); } }