Exemplo n.º 1
0
        //syntax: if <test> <consequent> <alternate>
        //syntax: if <test> <consequent>

        public override Node eval(Node exp, Environment env)
        {
            var length = Node.length(exp);

            if (length < 3 || length > 4)
            {
                Console.Error.WriteLine("Error: Invalid length for if expression");
                return(Nil.getInstance());
            }
            var test       = exp.getCdr().getCar();
            var consequent = exp.getCdr().getCdr().getCar();

            var alternate = new Node();

            if (length == 4) //has alternates
            {
                alternate = exp.getCdr().getCdr().getCdr().getCar();
            }
            else //If <test> yields a false value and no <alternate> is specified, then the result of the expression is unspecified.
            {
                alternate = Unspecific.getInstance();
            }

            if (test.eval(env) != BoolLit.getInstance(false))
            {
                return(consequent.eval(env));
            }
            return(alternate.eval(env));
        }
Exemplo n.º 2
0
        public override Node eval(Node exp, Environment env)
        {
            if (Node.length(exp) <= 2)
            {
                Console.Error.WriteLine("Error: invalid let expression");
                return(Nil.getInstance());
            }
            var car = exp.getCdr().getCar();
            var cdr = exp.getCdr().getCdr();

            if (Node.length(car) <= 0)
            {
                Console.Error.WriteLine("Error: invalid let expression");
                return(Nil.getInstance());
            }

            var env2 = new Environment(env);

            if (initialize(car, env, env2) < 0)
            {
                Console.Error.WriteLine("Error: invalid let expression");
                return(Nil.getInstance());
            }
            return(evalBody(cdr, env2));
        }
Exemplo n.º 3
0
        public Node eval(Node a, Environment e)
        {
            Node node     = new Cons(new Ident(a.getName()), Nil.getInstance());
            Node argument = evalAll(node, e);

            if (!argument.getCar().isPair())
            {
                if (Enviornment.errorMessages.size() == 0)
                {
                    Console.Error.WriteLine("Error: should not be a pair.");
                }
                else if (argument.getCar().isNumber())
                {
                    return(new IntLit(argument.getCar().getVal()));
                }
                else if (argument.getCar().isString())
                {
                    return(new StringLit(argument.getCar().getStringVal()));
                }
                else if (argument.getCar().isBool())
                {
                    return(new boolLit(argument.getCar().getBool()));
                }
                else
                {
                    Console.Write("just chilling here for the time being.");
                    return(Nil.getInstance());
                }
            }
            else
            {
                reutn null;
            }
            return(new stringLit(""));
        }
Exemplo n.º 4
0
        // to evaluate expressions of the form '(if b t e)',
        // evaluate b, then if b is not the boolean constant #f,
        // evaluate t and return the result. otherwise, evaluate
        // e and return the result.
        public override Node eval(Node t, Environment env)
        {
            // if cdr is nil, return nil (error state)
            if (t.getCdr() == Nil.getInstance())
            {
                Console.Error.WriteLine("Special form 'If' evaluated with no arguments");
                return(Nil.getInstance());
            }

            // get cdr of expression (conditional and execution statements)
            t = t.getCdr();

            // if cdr of t is nil, expression has a conditional but no executable statements (error state)
            if (t.getCdr() == Nil.getInstance())
            {
                Console.Error.WriteLine("Special form 'If' evaluated with insufficient arguments");
                return(Nil.getInstance());
            }

            // evaluate car of b (conditional). if b is not #f, evaluate and return t.
            if (t.getCar().eval(env) != BoolLit.getInstance(false))
            {
                return(t.getCdr().getCar().eval(env));
            }
            else
            {
                // otherwise, b is #f. evaluate and return e.
                // if e is nil, statement is still valid. interpreter will parse and return nil.
                return(t.getCdr().getCdr().getCar().eval(env));
            }
        }
Exemplo n.º 5
0
 public Node evalFrame(Node a, Environment e)
 {
     if (a == null || a.isNull())
     {
         return(new Cons(Nil.getInstance(), Nil.getInstance()));
     }
     else
     {
         Node argument     = a.getCar().getCar();
         Node expression   = a.getCar().getCdr().getCar();
         Node errThangElse = a.getCdr();
         if (argument.isSymbol())
         {
             environment.define(argument, expression.eval(e));
             return(evalFrame(errThangElse, e));
         }
         else if (argument.isPair())
         {
             return(argument.eval(e));
         }
         else if (argument == null || argument.isNull)
         {
             return(Nil.getInstance());
         }
     }
     return(null);
 }
Exemplo n.º 6
0
        private Node apply0()
        {
            string name = symbol.getName();

            if (name.Equals("read"))
            {
                var parser = new Parser(new Scanner(Console.In), new TreeBuilder());
                var exp    = (Node)parser.parseExp();
                if (exp != null)
                {
                    return(exp);
                }
                return(new Ident("end-of-file"));
            }
            if (name.Equals("newline"))
            {
                Console.WriteLine();
                return(Unspecific.getInstance());
            }
            if (name.Equals("interaction-environment"))
            {
                return(Scheme4101.env);
            }
            Console.Error.WriteLine("Error: wrong number of arguments");
            return(Nil.getInstance());
        }
Exemplo n.º 7
0
        public void define(Node id, Node val)
        {
            Node temp = find(id, this.frame);
            Node node = new Cons(id, new Cons(val, Nil.getInstance()));

            this.frame = new Cons(node, this.frame);
        }
Exemplo n.º 8
0
        private Node evalArithmetic(int arg1, int arg2)
        {
            string name = symbol.getName();

            if (name.Equals("b+"))
            {
                return(new IntLit(arg1 + arg2));
            }
            if (name.Equals("b-"))
            {
                return(new IntLit(arg1 - arg2));
            }
            if (name.Equals("b*"))
            {
                return(new IntLit(arg1 * arg2));
            }
            if (name.Equals("b/"))
            {
                return(new IntLit(arg1 / arg2));
            }
            if (name.Equals("b="))
            {
                return(BoolLit.getInstance(arg1 == arg2));
            }
            if (name.Equals("b<"))
            {
                return(BoolLit.getInstance(arg1 < arg2));
            }
            Console.Error.WriteLine("Error: unknown arithmetic symbol");
            return(Nil.getInstance());
        }
Exemplo n.º 9
0
        public Node evalBody(Node t, Environment env)
        {
            if (t.isNull())
            {
                return(Nil.getInstance());
            }
            else
            {
                Node arg  = t.getCar().getCar();
                Node func = t.getCar().getCdr().getCar();
                Node rest = t.getCdr();

                if (arg.isSymbol())
                {
                    env.define(arg, func.eval(env));
                    return(evalBody(rest, env));
                }
                else if (arg.isPair())
                {
                    return(arg.eval(env));
                }
                else if (arg.isNull())
                {
                    return(Nil.getInstance());
                }
                return(null);
            }
        }
Exemplo n.º 10
0
 public Node makeCons(Node exp, Environment env)
 {
     if (exp.isNull())
     {
         return(Nil.getInstance());
     }
     return(new Cons(exp.getCar().eval(env), makeCons(exp.getCdr(), env)));
 }
Exemplo n.º 11
0
 public override Node eval(Node exp, Environment env)
 {
     if (!exp.isNull())
     {
         return(exp.getCar().eval(env).apply(makeCons(exp.getCdr(), env)));
     }
     Console.Error.WriteLine("Error: invalid expression");
     return(Nil.getInstance());
 }
Exemplo n.º 12
0
        public override Node eval(Node exp, Environment env)
        {
            int  numArgs = 0;
            Node expCdr  = exp.getCdr();

            while (!expCdr.isNull())
            {
                numArgs++;
                expCdr = expCdr.getCdr();
            }

            if (numArgs < 2)
            {
                Console.Error.WriteLine("Error: invalid expression");
                return(Nil.getInstance());
            }
            Node bindings = exp.getCdr().getCar();
            Node body     = exp.getCdr().getCdr();
            Node cdr      = exp.getCdr().getCar();
            Node car;
            int  numBindings = 0;

            while (!cdr.isNull())
            {
                car = cdr.getCar();
                //bindings have proper format
                if (!car.isPair())
                {
                    Console.Error.WriteLine("Error: invalid expression");
                    return(Nil.getInstance());
                }
                numBindings++;
                cdr = cdr.getCdr();
            }
            //at least one binding
            if (numBindings == 0)
            {
                Console.Error.WriteLine("Error: invalid expression");
                return(Nil.getInstance());
            }
            Environment letEnv = new Environment(env);

            if (define(bindings, env, letEnv) == 0)
            {
                Node bcar = body.getCar().eval(letEnv);
                Node bcdr = body.getCdr();
                while (!bcdr.isNull())
                {
                    bcar = bcdr.getCar().eval(letEnv);
                    bcdr = bcdr.getCdr();
                }
                return(bcar);
            }
            Console.Error.WriteLine("Error: invalid expression");
            return(Nil.getInstance());
        }
Exemplo n.º 13
0
        public Node eval(Node t, Environment e)
        {
            Node cdr = t.getCdr();

            if (cdr == null)
            {
                Console.Error.WriteLine("Error: Cond is null");
            }
            return(Nil.getInstance());
        }
Exemplo n.º 14
0
 private Node buildArgsList(Node exp, Environment env)
 {
     if (!exp.isNull())
     {
         var car = exp.getCar();
         var cdr = exp.getCdr();
         return(new Cons(car.eval(env), buildArgsList(cdr, env)));
     }
     return(Nil.getInstance());
 }
Exemplo n.º 15
0
 public override Node eval(Node t, Environment env)
 {
     if (env.lookup(this) != null)
     {
         return(env.lookup(this).eval(env));
     }
     else
     {
         return(Nil.getInstance());
     }
 }
Exemplo n.º 16
0
        public override Node eval(Node exp, Environment env)
        {
            if (Node.length(exp) < 2)
            {
                Console.Error.WriteLine("Error: invalid cond expression");
                return(Nil.getInstance());
            }
            var exps = exp.getCdr();

            return(evalClauses(exps, env));
        }
Exemplo n.º 17
0
        public override Node eval(Node exp, Environment env)
        {
            if (Node.length(exp) < 1)
            {
                Console.Error.WriteLine("Error: invalid regular expression");
                return(Nil.getInstance());
            }
            var car = exp.getCar();
            var cdr = exp.getCdr();

            return(car.eval(env).apply(buildArgsList(cdr, env)));
        }
Exemplo n.º 18
0
 public override Node eval(Node exp, Environment env)
 {
     if (Node.length(exp) < 2)
     {
         Console.Error.WriteLine("Error: invalid begin expression");
         return(Nil.getInstance());
     }
     else
     {
         return(begin(exp.getCdr(), env));
     }
 }
Exemplo n.º 19
0
        private Node apply2(Node arg1, Node arg2)
        {
            string name = symbol.getName();

            if (name.Equals("eq?"))
            {
                if (arg1.isSymbol() && arg2.isSymbol())
                {
                    return(BoolLit.getInstance(arg1.getName().Equals(arg2.getName())));
                }
                return(BoolLit.getInstance(arg1 == arg2));
            }
            if (name.Equals("cons"))
            {
                return(new Cons(arg1, arg2));
            }
            if (name.Equals("set-car!"))
            {
                arg1.setCar(arg2);
                return(Unspecific.getInstance());
            }
            if (name.Equals("set-cdr!"))
            {
                arg1.setCdr(arg2);
                return(Unspecific.getInstance());
            }
            if (name.Equals("eval"))
            {
                if (arg2.isEnvironment())
                {
                    Environment envArg1 = (Environment)arg1;
                    return(arg1.eval(envArg1));
                }
                Console.Error.WriteLine("Error: argument is not an environment");
                return(Nil.getInstance());
            }
            if (name.Equals("apply"))
            {
                return(arg1.apply(arg2));
            }
            if (name[0].Equals('b') && name.Length == 2)
            {
                if (arg1.isNumber() && arg2.isNumber())
                {
                    return(evalArithmetic(arg1.getIntVal(), arg2.getIntVal()));
                }
                Console.Error.WriteLine("Error: invalid arguments");
                return(Nil.getInstance());
            }
            Console.Error.WriteLine("Error: wrong number of arguments");
            return(Nil.getInstance());
        }
Exemplo n.º 20
0
        private Node evalClauses(Node exp, Environment env)
        {
            if (exp.isNull())
            {
                return(Unspecific.getInstance());
            }
            var clause = exp.getCar();

            if (Node.length(clause) <= 0)
            {
                Console.Error.WriteLine("Error: invalid cond expression");
                return(Nil.getInstance());
            }

            var testExp    = clause.getCar();
            var expression = clause.getCdr();

            if (testExp.isSymbol() && testExp.getName().Equals("else"))
            {
                if (!expression.isNull() && exp.getCdr().isNull())
                {
                    return(evalExp(expression, env));
                }
                Console.Error.WriteLine("Error: invalid expression");
                return((Node)Nil.getInstance());
            }
            var testValid = testExp.eval(env);

            if (testValid == BoolLit.getInstance(false))
            {
                var nextExps = exp.getCdr();
                return(evalClauses(nextExps, env));
            }
            if (expression.isNull())
            {
                return(BoolLit.getInstance(true));
            }
            var exp1 = expression.getCar();

            if (!exp1.isSymbol() || !exp1.getName().Equals("=>"))
            {
                return(evalExp(expression, env));
            }
            if (Node.length(expression) != 2)
            {
                Console.Error.WriteLine("Error: invalid cond expression");
                return(Nil.getInstance());
            }
            var cdr = expression.getCdr().getCar();

            return(cdr.eval(env).apply(BoolLit.getInstance(true)));
        }
Exemplo n.º 21
0
        public void define(Node id, Node val)
        {
            Node value = find(id, frame);

            if (value == null)
            {
                frame = new Cons(new Cons(id, new Cons(val, Nil.getInstance())), frame);
            }
            else
            {
                value.setCar(val);
            }
        }
Exemplo n.º 22
0
 public void define(Node id, Node val)
 {
     // if frame doesn't exist in scope, create new frame
     if (find(id, val) == null)
     {
         frame = new Cons(new Cons(id, new Cons(val, Nil.getInstance())), frame);
     }
     else
     {
         // else, if frame does exist in scope, set term to val
         find(id, val).setCar(val);
     }
 }
Exemplo n.º 23
0
 public override Node eval(Node exp, Environment env)
 {
     if (Node.length(exp) != 2)
     {
         Console.Error.WriteLine("Error: invalid quote expression");
         return((Node)Nil.getInstance());
     }
     else
     {
         Node quoteExp = exp.getCdr().getCar();
         return(quoteExp);
     }
 }
Exemplo n.º 24
0
        public override Node eval(Node exp, Environment env)
        {
            if (Node.length(exp) != 3)
            {
                Console.Error.WriteLine("Error: invalid set expression");
                return((Node)Nil.getInstance());
            }
            Node var    = exp.getCdr().getCar();
            Node varExp = exp.getCdr().getCdr().getCar();

            env.assign(var, varExp.eval(env));
            return(Unspecific.getInstance());
        }
Exemplo n.º 25
0
        public void define(Node id, Node val)
        {
            Node definition = find(id, frame);

            if (definition != null)
            {
                definition.setCar(val);
            }
            else
            {
                Node frame = new Cons(id, new Cons(val, Nil.getInstance()));
                this.frame = new Cons(frame, this.frame);
            }
        }
Exemplo n.º 26
0
        public Node eval(Node t, Environment e)
        {
            Node current = t.getCdr().getCar();

            if (current != null)
            {
                return(current);
            }
            else
            {
                Console.Error.WriteLine("Error: Null inside Quote");
                return(Nil.getInstance());
            }
        }
Exemplo n.º 27
0
        public void define(Node id, Node val)
        {
            Node temp = find(id, this.frame);

            if (temp == null)
            {
                Node node = new Cons(id, new Cons(val, Nil.getInstance()));
                this.frame = new Cons(node, this.frame);
            }
            else
            {
                Console.WriteLine("error");
            }
        }
Exemplo n.º 28
0
        // TODO: implement
        public override Node apply(Node args)
        {
            Environment e = new Environment(env);
            Node        n = fun.getCar().getCdr();

            while (n != Nil.getInstance() && args != Nil.getInstance())
            {
                e.define(n.getCar(), args.getCar());
                n    = n.getCdr();
                args = args.getCdr();
            }

            return(Nil.getInstance());
            //Node funBody = ;
        }
Exemplo n.º 29
0
        public void assign(Node id, Node val)
        {
            // search for id in id_value_pair in frame heirarchy
            Node result_lookup = lookup(id);

            // if nothing found, report error.
            if (result_lookup == null)
            {
                Console.Error.WriteLine("Exception in assigning: variable with that name does not exist");
            }
            else
            {
                result_lookup = new Cons(val, Nil.getInstance());
            }
        }
Exemplo n.º 30
0
        public override Node apply(Node args)
        {
            Environment theEnv = new Environment(env);
            Node        lambda = fun.getCdr().getCar();

            while (lambda != Nil.getInstance())
            {
                theEnv.define(lambda.getCar(), args.getCar());
                lambda = lambda.getCdr();
                args   = args.getCdr();
            }
            Node function = fun.getCdr().getCdr().getCar();

            return(function.eval(theEnv));
        }
Exemplo n.º 31
0
        // TODO: The method apply() should be defined in class Node
        // to report an error.  It should be overridden only in classes
        // BuiltIn and Closure.
        public new Node apply(Node args)
        {
            if(args == null)
            {
                Console.Write("Error: no Node");
                return new Nil(); //was return null;
            }
            Node car = args.getCar();
            Node cdr = args.getCdr();
            if(car.isNull())    //IF CAR DOESN'T EXIST
            {
                car = new Nil();
            }
            if(cdr.isNull())   //IF CDR DOESN'T EXIST
            {
                cdr = new Nil();
            }
            else
            {
                cdr = cdr.getCar();  //THIS IS THE CADR, DOESNT WORK FOR (1 . 2)
            }
            String symbolNode = symbol.getName();
            if(symbolNode.Equals("symbol?"))
            {
                return new BoolLit(car.isSymbol());
            }
            if(symbolNode.Equals("number?"))
            {
                return new BoolLit(car.isNumber());
            }

            if(car.isNumber() && cdr.isNumber())
            {
                int a = car.getValue();
                int b = cdr.getValue();
                if(symbolNode.Equals("b+"))
                {
                    return new IntLit(a + b);
                }
                else if(symbolNode.Equals("b-"))
                {
                    return new IntLit(a - b);
                }
                else if(symbolNode.Equals("b*"))
                {
                    return new IntLit(a * b);
                }
                else if(symbolNode.Equals("b/"))
                {
                    return new IntLit(a / b);
                }
                else if(symbolNode.Equals("b="))
                {
                    return new BoolLit(a==b);
                }
                else if(symbolNode.Equals("b<"))
                {
                    return new BoolLit(a<b);
                }
                else if(symbolNode.Equals("b>"))
                {
                    return new BoolLit(a>b);
                }
                else
                {
                    Console.Write("Shit broke in Builtin becuase of pizza and Netflix all day.");
                    return new Nil();
                }
            }
            if(symbolNode.Equals("car"))
            {
                 car = car.getCar(); //previously had check for null car
                 if (car.isNull())
                    Console.WriteLine("OOOOOOH SHIT DEMS BE ERRORS IN BUILTIN APPLY CALL OF CAR");
                 return car;
            }
            if(symbolNode.Equals("cdr")) //requires a list, minimum '(example)
            {
                cdr = car.getCdr();
                if (cdr.isNull())
                    Console.WriteLine("OOOOOOH SHIT DEMS BE ERRORS IN BUILTIN APPLY CALL OF CDR");
                return car.getCdr();
            }
            if(symbolNode.Equals("cons"))
            {
                return new Cons(car,cdr); //assumes we already have a list going on
            }
            if(symbolNode.Equals("set-car!")) //needs better checks of criteria, errors
            {
                car.setCar(cdr); //this looks correct.
                return car;
            }
            if(symbolNode.Equals("set-cdr!")) //needs better checks of criteria, errors
            {
                car.setCdr(cdr);
                return car;
            }
            if(symbolNode.Equals("null?"))
            {
                return new BoolLit(car.isNull()); //car is never null.
            }
            if(symbolNode.Equals("pair?"))
            {
                return new BoolLit(car.isPair());
            }
            if(symbolNode.Equals("eq?"))
            {
                if(car.isNumber() && cdr.isNumber())
                {
                    return new BoolLit(car.getValue()==cdr.getValue());
                }
                else if(car.isString() && cdr.isString())
                {
                    return new BoolLit(car.getValue().Equals(cdr.getValue()));
                }
                else if(car.isSymbol() && cdr.isSymbol())
                {
                    return new BoolLit(car.getValue().Equals(cdr.getValue()));
                }
                else if(car.isBool() && cdr.isBool())
                {
                    return new BoolLit(car.getBool().Equals(cdr.getBool()));
                }
            }
            if(symbolNode.Equals("procedure?"))
            {
                return new BoolLit(car.isProcedure());
            }
            if(symbolNode.Equals("read")) // not started
            {

                return null;
            }
            if(symbolNode.Equals("write")) // not started
            {
                car.print(0);
                return new StringLit("");
            }
            if(symbolNode.Equals("display"))
            {
                return car;
            }
            if(symbolNode.Equals("newline")) // is this right?!
            {
                return new StringLit("");
            }
            if(symbolNode.Equals("eval")) // is this right?!
            {
                return car;
            }
            if(symbolNode.Equals("apply"))
            {
                return car.apply(cdr); //??
            }
            if(symbolNode.Equals("interaction-environment")) // not started
            {
                return null;
                //what the flying f**k?!?
            }

            //now???!!!!
            return null;
        }
Exemplo n.º 32
0
 public static Nil getNil()
 {
     if (nil == null)
         nil = new Nil();
     return nil;
 }