public override Node eval(Node t, Environment env) { //arg1: set! //arg2: variable //arg3: value env.assign(t.getCdr().getCar(), t.getCdr().getCdr().getCar().eval(env)); return new StringLit("set done"); }
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 'set!.'")); } else if (args.getCdr().getCdr().isNull() == false) { return(new StringLit("Error: Too many arguments passed to 'set!.'")); } // 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); // set!.apply() return(env.assign(expr1.getCar(), lambdaExpr.eval(env))); } else { return(new StringLit("Error: First argument to 'set!' must be a <variable>")); } } else { if (expr1.isSymbol() == true) { // set!.apply() return(env.assign(expr1, args.getCdr().getCar().eval(env))); } else { return(new StringLit("Error: First argument to 'set!' must be a <variable>")); } } }
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()); }
public Node eval(Node t, Environment e) { Node current = t.getCdr().getCar(); if (!current.isSymbol()) { Console.Error.WriteLine("Error: Not an identifier"); return Nil.getInstance(); } // insert some methods about env, kinda confusing/binding stuff Node final = t.getCdr().getCdr().getCar(); final = final.eval(final, e); e.assign(current, final); return new StringLit("; " + current.getName() + " - updated."); }
// - assign to a name (for implementing set!) // if the name exists in the innermost scope, update the value // if it doesn't exist, perform the assignment in the enclosing scope // if we don't find the name, it is an error public void assign(Node id, Node val) { if (this.lookup(id) != null) { frame.setCdr(new Cons(val, null)); } else if (env.lookup(id) != null) { env.assign(id, val); } else { Console.Error.WriteLine("Name not found Env.assign: " + id.getName()); } }
public Node eval(Node t, Environment e) { Node current = t.getCdr().getCar(); if (!current.isSymbol()) { Console.Error.WriteLine("Error: Not an identifier"); return(Nil.getInstance()); } // insert some methods about env, kinda confusing/binding stuff Node final = t.getCdr().getCdr().getCar(); final = final.eval(final, e); e.assign(current, final); return(new StringLit("; " + current.getName() + " - updated.")); }
public void assign(Node id, Node val) { Node node = find(id, frame); if (node == null && env == null) { Console.Error.WriteLine("Undefined variable " + id.getName()); } else if (node == null) { env.assign(id, val); } else { node.setCar(val); } }
public void assign(Node id, Node val) { // if the term and the env are null, variable undefined (error state) if (find(id, val) == null && env == null) { Console.Error.WriteLine("undefined variable: " + id.getName()); } else if (find(id, val) == null) { // else, if the term is undefined (and env is), assign the term to env env.assign(id, val); } else { // else, if both term and env are defined, set the car of the term to val find(id, frame).setCar(val); } }
// from prof email: The method assign() is for implementing Set.eval(). // It modifies the value of an existing variable. // The recursive structure is the same as for lookup(), except that after calling find(), // the value should be updated instead of returned public void assign(Node id, Node val) { // DONE :: implement this function Node value = find(id, frame); if (value.isNull() && env == null) { Console.Error.WriteLine("undefined variable " + id.getName()); } else if (value.isNull()) { env.assign(id, val); } else { value.setCar(val); } }
public override Node eval(Node exp, Environment env) { int num = Util.expLength(exp); //(set-cdr! (assq ’x (car env)) (list 15)), need length 3 bool flag = num != 3; Node instance; if (flag) { Console.Error.WriteLine("Error: invalid expression"); instance = Nil.getInstance(); } else { Node car = exp.getCdr().getCar(); //Console.WriteLine(car); Node car2 = exp.getCdr().getCdr().getCar(); //Console.Writeline(car2) env.assign(car, car2.eval(env)); instance = Unspecific.getInstance(); } return instance; }
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(); Node arg2 = exp.getCdr().getCdr().getCar(); env.assign(arg1, arg2.eval(env)); return(new StringLit("#{Unspecific}", false)); }