protected boolean eval_loop(Reader reader, boolean display,
			AppFrame errframe) {
		Parser parser = new Parser(reader);
		errtag = "";

		while (true) {
			try {
				Value p = parser.parsePara();
				if (p == null)
					return true; // End of input

				last_val = null;

				Evaluator ev = new Evaluator(p, parser.getText(), display, log);

				try {
					last_val = ev.execute();
				} catch (Evaluator.EvalException e) {
					evalError("Aargh: ", e.getMessage(), e.getErrtag());
					return false;
				} catch (Throwable e) {
					evalError("Failure: ", e.toString(), "#failure");
					return false;
				} finally {
					if (display) {
						if (statsFlag)
							ev.printStats(log);
						log.flush();
					}
				}
			} catch (Scanner.SyntaxException e) {
				if (errframe == null)
					evalError("Oops: ", e.toString(), e.getErrtag());
				else {
					evalError("Oops: ", e.shortMessage(), e.getErrtag());
					errframe.showError(e.getStart(), e.getEnd());
				}
				return false;
			}
		}
	}