Refactor to use run scripts, remove *_RUNSTEP
[jackhill/mal.git] / plpgsql / step0_repl.sql
1 -- ---------------------------------------------------------
2 -- step0_repl.sql
3
4 \i init.sql
5 \i io.sql
6
7 -- ---------------------------------------------------------
8
9 CREATE SCHEMA mal;
10
11 -- read
12 CREATE FUNCTION mal.READ(line varchar) RETURNS varchar AS $$
13 BEGIN
14 RETURN line;
15 END; $$ LANGUAGE plpgsql;
16
17 -- eval
18 CREATE FUNCTION mal.EVAL(ast varchar, env varchar) RETURNS varchar AS $$
19 BEGIN
20 RETURN ast;
21 END; $$ LANGUAGE plpgsql;
22
23 -- print
24 CREATE FUNCTION mal.PRINT(exp varchar) RETURNS varchar AS $$
25 BEGIN
26 RETURN exp;
27 END; $$ LANGUAGE plpgsql;
28
29
30 -- repl
31
32 CREATE FUNCTION mal.REP(line varchar) RETURNS varchar AS $$
33 BEGIN
34 RETURN mal.PRINT(mal.EVAL(mal.READ(line), ''));
35 END; $$ LANGUAGE plpgsql;
36
37 CREATE FUNCTION mal.MAIN(pwd varchar) RETURNS integer AS $$
38 DECLARE
39 line varchar;
40 output varchar;
41 BEGIN
42 WHILE true
43 LOOP
44 BEGIN
45 line := io.readline('user> ', 0);
46 IF line IS NULL THEN
47 PERFORM io.close(1);
48 RETURN 0;
49 END IF;
50 IF line NOT IN ('', E'\n') THEN
51 output := mal.REP(line);
52 PERFORM io.writeline(output);
53 END IF;
54
55 EXCEPTION WHEN OTHERS THEN
56 PERFORM io.writeline('Error: ' || SQLERRM);
57 END;
58 END LOOP;
59 END; $$ LANGUAGE plpgsql;