transcendental-lisp/src/function/builtin/special/AND.java

39 lines
975 B
Java

package function.builtin.special;
import static function.builtin.EVAL.eval;
import static sexpression.Symbol.T;
import function.*;
import sexpression.*;
@FunctionNames({ "AND" })
public class AND extends LispSpecialFunction {
private ArgumentValidator argumentValidator;
public AND(String name) {
this.argumentValidator = new ArgumentValidator(name);
}
@Override
public SExpression call(Cons argumentList) {
argumentValidator.validate(argumentList);
return callTailRecursive(argumentList, T);
}
private SExpression callTailRecursive(Cons argumentList, SExpression lastValue) {
SExpression currentValue = eval(argumentList.getFirst());
Cons remainingValues = (Cons) argumentList.getRest();
if (argumentList.isNull())
return lastValue;
if (currentValue.isNull())
return currentValue;
return callTailRecursive(remainingValues, currentValue);
}
}