Example #1
0
        public override LispNode Evaluate(Env env)
        {
            LispNode   func       = null;
            LambdaNode lambdaNode = null;

            func = What.Evaluate(env);

            if (!(func is LambdaNode))
            {
                return(null);
            }

            lambdaNode = func as LambdaNode;

            if (lambdaNode.Arguments.Count != Arguments.Count)
            {
                return(null);
            }

            Env newEnv = new Env(lambdaNode.Env); // use the lambda env, not the global env, for lexical closures

            for (int i = 0; i < Arguments.Count; i++)
            {
                newEnv.Add(lambdaNode.Arguments[i], Arguments[i].Evaluate(env));
            }

            return(lambdaNode.Call(newEnv));
        }
Example #2
0
        public override LispNode Evaluate(Env env)
        {
            if (env.Find(VariableName) == null)
            {
                return(null);
            }

            LispNode exp = Expression.Evaluate(env);

            env.Set(VariableName, exp);
            return(exp); // probably not ideomatic scheme but we can chain set!s.
        }
Example #3
0
        public LispNode a, b, c; // if a then b else c

        public override LispNode Evaluate(Env env)
        {
            object test = a.Evaluate(env);

            if (!(test is BoolNode))
            {
                return(null);
            }
            else if ((test as BoolNode).Value)
            {
                return(b.Evaluate(env));
            }
            else
            {
                return(c.Evaluate(env));
            }
        }
Example #4
0
        public object Execute(String exp)
        {
            LispNode program = Read(TokenizeStream(exp));
            Env      env     = CreateGlobals();
            LispNode result  = program.Evaluate(env);

            if (result is IntNode)
            {
                return((result as IntNode).Value);
            }
            else if (result is BoolNode)
            {
                return((result as BoolNode).Value);
            }
            else if (result is QuoteNode)
            {
                return((result as QuoteNode).Value);
            }
            else
            {
                return(null);
            }
        }
Example #5
0
 public virtual LispNode Call(Env env)
 {
     return(Body.Evaluate(env));
 }
Example #6
0
 public override LispNode Evaluate(Env env)
 {
     env.Add(Name, Expression.Evaluate(env));
     return(this); // return this???
 }