Beispiel #1
0
    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);
    }
Beispiel #3
0
    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");
    }
Beispiel #4
0
 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);
    }
Beispiel #6
0
    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));
     }
 }