コード例 #1
0
        protected override EvalResult EvalImpl(ScmEnvironment env)
        {
            if (!_clauses.Any())
            {
                return(new SelfEvaluatingExpression(false).ToResult());
            }
            else
            {
                foreach (var clause in _clauses)
                {
                    var tokens = _tokenizer.Parse(_tokenizer.Strip(clause.Value)).ToArray();
                    if (tokens[0].Value == "else")
                    {
                        return(_factory.Create(tokens[1].Value).Eval(env));
                    }
                    else
                    {
                        var args = tokens.Select(x => _factory.Create(x.Value)).ToList();
                        if (True(args[0].Eval(env).Value))
                        {
                            return(args[1].Eval(env));
                        }
                    }
                }
            }

            return(new SelfEvaluatingExpression(false).ToResult());
        }
コード例 #2
0
        protected override EvalResult EvalImpl(ScmEnvironment env)
        {
            ScmExpression result = null;

            foreach (var scmExpression in _exprs)
            {
                result = scmExpression.Eval(env).Value;
            }
            return(result.ToResult());
        }
コード例 #3
0
ファイル: IfExpression.cs プロジェクト: y-gagar1n/Shceme
 protected override EvalResult EvalImpl(ScmEnvironment env)
 {
     if (True(_predicate.Eval(env).Value))
     {
         return(_then.Eval(env));
     }
     else
     {
         return(_else.Eval(env));
     }
 }
コード例 #4
0
 private object[] MapValues(ScmExpression[] exps, ScmEnvironment env)
 {
     return(exps.Select(x => x.Eval(env).Value).Select(x =>
     {
         if (x is SelfEvaluatingExpression)
         {
             return (x as SelfEvaluatingExpression).Value;
         }
         else
         {
             return x;
         }
     }).ToArray());
 }
コード例 #5
0
        protected override EvalResult EvalImpl(ScmEnvironment env)
        {
            var exp = @Operator.Eval(env).Value;

            if (exp is ProcedureExpression)
            {
                var    proc = exp as ProcedureExpression;
                object ve;

                object[] mappedOperands;
                if (proc.Proc is PrimitiveProcedure)
                {
                    mappedOperands =
                        Arguments.Select(x => x.Eval(env).Value)
                        .OfType <SelfEvaluatingExpression>()
                        .Select(x => x.Value)
                        .ToArray();
                }
                else
                {
                    mappedOperands = MapValues(Arguments, env);
                }

                var applyResult = proc.Proc.Apply(mappedOperands);
                if (applyResult.Success)
                {
                    return(new SelfEvaluatingExpression(applyResult.Value).ToResult());
                }
                else
                {
                    string msg = "";
                    if (@Operator is VariableExpression)
                    {
                        string procedureName = (@Operator as VariableExpression).VariableName;
                        msg = String.Format("Error while applying procedure {0}:{1}", procedureName,
                                            Environment.NewLine);
                    }

                    return(EvalResult.Error(msg + applyResult.ErrorMessage));
                }
            }
            else if (exp is ApplicationExpression)
            {
                var application = exp as ApplicationExpression;
                return(application.Eval(env));
            }

            return(exp.ToResult());
        }
コード例 #6
0
        protected override EvalResult EvalImpl(ScmEnvironment env)
        {
            if (_arguments[0].Type == TokenType.Symbol)
            {
                DefineVariable(_arguments[0].Value, _factory.Create(_arguments[1].Value), env);
            }
            else if (_arguments[0].Type == TokenType.Tuple)
            {
                var pars        = _tokenizer.Parse(_tokenizer.Strip(_arguments[0].Value)).ToList();
                var newVariable = pars[0].Value;
                var lambda      = new LambdaExpression(_factory.Create(_arguments[1].Value), pars.Skip(1).Select(x => x.Value).ToArray(), env);
                var newValue    = lambda.Eval(env).Value;
                DefineVariable(newVariable, newValue, env);
            }

            return(new VoidExpression().ToResult());
        }
コード例 #7
0
ファイル: ScmExpression.cs プロジェクト: y-gagar1n/Shceme
        public EvalResult Eval(ScmEnvironment env)
        {
            var result = this.EvalImpl(env);

            if (result.Success)
            {
                var exp       = this.EvalImpl(env).Value;
                var resultExp = exp;
                while (!(resultExp is SelfEvaluatingExpression) && !(resultExp is ProcedureExpression))
                {
                    var innerResult = resultExp.Eval(env);
                    if (!innerResult.Success)
                    {
                        return(innerResult);
                    }
                    resultExp = resultExp.Eval(env).Value;
                }
                return(resultExp.ToResult());
            }
            else
            {
                return(result);
            }
        }
コード例 #8
0
 protected override EvalResult EvalImpl(ScmEnvironment env)
 {
     return(this.ToResult());
 }
コード例 #9
0
 public LambdaProcedure(ScmExpression exp, ScmEnvironment env, string[] parameters)
 {
     _parameters     = parameters;
     _scmEnvironment = env;
     _scmExpression  = exp;
 }
コード例 #10
0
 private void DefineVariable(string var, ScmExpression val, ScmEnvironment env)
 {
     env.Dict[var] = val;
 }
コード例 #11
0
 protected override EvalResult EvalImpl(ScmEnvironment env)
 {
     throw new NotImplementedException();
 }
コード例 #12
0
 public LambdaExpression(ScmExpression body, string[] parameters, ScmEnvironment env) : base(null)
 {
     _env        = env;
     _body       = body;
     _parameters = parameters;
 }
コード例 #13
0
        protected override EvalResult EvalImpl(ScmEnvironment env)
        {
            var proc = new LambdaProcedure(_body, _env, _parameters);

            return((new ProcedureExpression(proc)).ToResult());
        }
コード例 #14
0
 protected override EvalResult EvalImpl(ScmEnvironment env)
 {
     SetVariable(_variable, _value.Eval(env).Value, env);
     return(null);
 }
コード例 #15
0
        protected override EvalResult EvalImpl(ScmEnvironment env)
        {
            var result = env.Lookup(_variableName);

            return((result is ScmExpression ? result as ScmExpression : new SelfEvaluatingExpression(result)).ToResult());
        }
コード例 #16
0
ファイル: ScmExpression.cs プロジェクト: y-gagar1n/Shceme
 protected abstract EvalResult EvalImpl(ScmEnvironment env);
コード例 #17
0
ファイル: ProcedureFactory.cs プロジェクト: y-gagar1n/Shceme
        public ScmProcedure Create(ScmExpression exp, ScmEnvironment env)
        {
            var variableName = (exp as VariableExpression).VariableName as string;

            return(env.Dict[variableName] as ScmProcedure);
        }
コード例 #18
0
 private void SetVariable(object variable, ScmExpression eval, ScmEnvironment env)
 {
 }