/* * Name: Mike Cifelli * Course: CIS 443 - Programming Languages * Assignment: Lisp Interpreter 1 */ package eval; import parser.*; /** * COND represents the COND form in Lisp. */ public class COND extends LispFunction { public SExpression call(Cons argList) { if (argList.nullp()) { // return NIL if there are were no arguments passed to COND return Nil.getUniqueInstance(); } SExpression argCar = argList.getCar(); // first clause Cons argCdr = (Cons) argList.getCdr(); // list of remaining clauses // make sure the first clause is a list and is not NIL if (argCar.consp()) { Cons clause = (Cons) argCar; SExpression test = EVAL.eval(clause.getCar()); if (test != Nil.getUniqueInstance()) { // the car of this clause is true, so we evaluate its cdr SExpression cdr = clause.getCdr(); SExpression retval = test; // evaluate all the S-expressions in the cdr of the clause while (cdr.consp()) { retval = EVAL.eval(((Cons) cdr).getCar()); cdr = ((Cons) cdr).getCdr(); } // return the value of the last S-expression evaluated return retval; } // the car of this clause is false, so we test any remaining // clauses // check if the list of remaining clauses is a list and is not NIL if (argCdr.consp()) { return call(argCdr); } // there are no remaining clauses, so we return NIL return Nil.getUniqueInstance(); } throw new RuntimeException("COND: clause " + argCar + " should be a list"); } /** * Determine if the arguments passed to this Lisp function should be * evaluated. * * @return * false */ public boolean evaluateArguments() { return false; } }