@Override
public Token eval(AbstractClass<?> caller, Token first, Token last, AbstractFrame frame) throws ArrayIndexOutOfBoundsException, IllegalArgumentException, InterpreterException {
Variable<?> f = (Variable<?>) first.getCar();
if (!f.getType().equals(Interpreter.booleanClass))
throw new UnexpectedTypeException("The type, " + f.getType() + ", is not compatible with the attempted operation.");
if (!((Variable<Boolean>) f).getSource())
return new Token(new PrimitiveObject<>(Interpreter.booleanClass, false), Interpreter.booleanType);
if (last.getCarType().equals(Interpreter.blockType))
last = (Token) last.getCar();
last = Interpreter.eval(caller, last, frame);
if (!((Variable<?>) last.getCar()).getType().equals(Interpreter.booleanClass))
throw new UnexpectedTypeException("The type, " + last.getCarType() + ", is not compatible with the attempted operation.");
return new Token(new PrimitiveObject<>(Interpreter.booleanClass, ((Variable<Boolean>) last.getCar()).getSource()), Interpreter.booleanType);
}