aboutsummaryrefslogtreecommitdiff
path: root/examples/repl.zc
blob: bff96c386edd1ecacbc7c431c443d83edb633c1a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace;
include rt, run;

// a repl on the resident compiler: each backtick-separated chunk of input is
// compiled as a function body and run. definitions (fn ...) can be loaded too:
// a chunk that starts with "fn" goes through load instead of eval.
let buf[4000];
fn readchunk() {
	let n = 0, c;
	while (!rt.eof()) {
		c = rt.get_c();
		if (c == 96) break;
		if (n < 3999) { buf[n] = c; n++; }
	}
	buf[n] = 0;
	return n;
}
void main() {
	let q, i;
	while (!rt.eof()) {
		readchunk();
		q = run.tokens(buf);
		if (q[0] && q[1] == run.T_ID && q[2] == run.intern("fn")) run.load(q);
		else run.eval(q);
		rt.free(q);
	}
	return;
}