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