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; }
// 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); }
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)); }
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()); }
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>")); } } }