Пример #1
0
        public override Node eval(Node exp, Environment env)
        {
            int length = Util.expLength(exp);
            if (length < 3)
            {
                Console.Error.WriteLine("Error: invalid expression");
                return Nil.getInstance();
            }
            Node second = exp.getCdr().getCar();
            Node name, value;
            if (length == 3 && second.isSymbol())
            {
                name = second;
                value = exp.getCdr().getCdr().getCar().eval(env);
                env.define(name, value);
                return null;
            }
            if (!second.isPair())
            {
                Console.Error.WriteLine("Error: invalid expression");
                return Nil.getInstance();
            }
            name = second.getCar();
            Node lambda = exp.getCdr();
            lambda.setCar(second.getCdr());
            lambda = new Cons(new Ident("lambda"), lambda);
            value = lambda.eval(env);
            env.define(name, value);

            return null;
        }
Пример #2
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 override Node apply(Node args)
 {
     Environment funcEnvironment = new Environment(env);
     Node param = fun.getCdr().getCar();
     while (param != Nil.getInstance() && args != Nil.getInstance())
     {
         funcEnvironment.define(param.getCar(), args.getCar());
         param = param.getCdr();
         args = args.getCdr();
     }
     Node body = new Cons(new Ident("begin"), fun.getCdr().getCdr());
     return body.eval(funcEnvironment);
 }
Пример #3
0
        public override Node apply(Node args)
        {
            Environment funcEnv = new Environment(env);
            Node        temp    = fun.getCdr().getCar();

            while (temp != Nil.getInstance())
            {
                funcEnv.define(temp.getCar(), args.getCar());
                temp = temp.getCdr();
                args = args.getCdr();
            }
            Node body = new Cons(new Ident("begin"), fun.getCdr().getCdr());

            return(body.eval(funcEnv));
        }
Пример #4
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 arg1 = exp.getCdr().getCar();

            if (numArgs == 2 && arg1.isSymbol())
            {
                Node val = exp.getCdr().getCdr().getCar();
                env.define(arg1, val.eval(env));
                return(new StringLit("; no values returned", false));
            }
            if (arg1.isPair())
            {
                Node fName     = arg1.getCar();
                Node fArgs     = arg1.getCdr();
                Node fBody     = exp.getCdr().getCdr();
                bool validArgs = verifyArgs(fArgs);
                if (fName.isSymbol() && validArgs)
                {
                    Node node = new Cons(new Ident("lambda"), new Cons(fArgs, fBody));
                    env.define(fName, node.eval(env));
                    return(new StringLit("; no values returned", false));
                }
                Console.Error.WriteLine("Error: ill-formed definition");
                return(Nil.getInstance());
            }
            Console.Error.WriteLine("Error: invalid expression");
            return(Nil.getInstance());
        }
Пример #5
0
        public override Node eval(Environment env, Node args)
        {
            Node expr1 = args.getCar();

            if (args.getCdr().isNull() == true)
            {
                return(new StringLit("Error: Only 1 argument passed to 'define.'"));
            }
            else if (args.getCdr().getCdr().isNull() == false)
            {
                return(new StringLit("Error: Too many arguments passed to 'define.'"));
            }
            // Is this defining a function?
            else if (expr1.isPair() == true)
            {
                if (expr1.getCar().isSymbol() == true)
                {
                    // Construct the lambda expression
                    Node formalsAndBody = new Cons(expr1.getCdr(), args.getCdr());
                    Node lambdaExpr     = new Cons(new Ident("lambda"), formalsAndBody);
                    // define.apply()
                    return(env.define(expr1.getCar(), lambdaExpr.eval(env)));
                }
                else
                {
                    return(new StringLit("Error: First argument to 'define' must be a <variable>"));
                }
            }
            else
            {
                if (expr1.isSymbol() == true)
                {
                    // define.apply()
                    return(env.define(expr1, args.getCdr().getCar().eval(env)));
                }
                else
                {
                    return(new StringLit("Error: First argument to 'define' must be a <variable>"));
                }
            }
        }