plsql: self-hosting. Long strings, refactor io.
[jackhill/mal.git] / plsql / step1_read_print.sql
CommitLineData
97df14cd
JM
1@io.sql
2@types.sql
3@reader.sql
4@printer.sql
5
0fc03918 6CREATE OR REPLACE PACKAGE mal IS
97df14cd 7
10cc781f 8FUNCTION MAIN(args varchar DEFAULT '()') RETURN integer;
97df14cd 9
0fc03918 10END mal;
97df14cd
JM
11/
12
0fc03918 13CREATE OR REPLACE PACKAGE BODY mal IS
97df14cd 14
10cc781f 15FUNCTION MAIN(args varchar DEFAULT '()') RETURN integer IS
6a085103
JM
16 M mem_type; -- general mal value memory pool
17 H types.map_entry_table; -- hashmap memory pool
02936b42 18 line CLOB;
97df14cd 19
7836cfa3 20 -- read
0fc03918 21 FUNCTION READ(line varchar) RETURN integer IS
7836cfa3 22 BEGIN
6a085103 23 RETURN reader.read_str(M, H, line);
7836cfa3 24 END;
97df14cd 25
7836cfa3 26 -- eval
0fc03918 27 FUNCTION EVAL(ast integer, env varchar) RETURN integer IS
7836cfa3
JM
28 BEGIN
29 RETURN ast;
30 END;
97df14cd 31
7836cfa3 32 -- print
0fc03918 33 FUNCTION PRINT(exp integer) RETURN varchar IS
7836cfa3 34 BEGIN
6a085103 35 RETURN printer.pr_str(M, H, exp);
7836cfa3
JM
36 END;
37
7836cfa3
JM
38 -- repl
39 FUNCTION REP(line varchar) RETURN varchar IS
40 BEGIN
41 RETURN PRINT(EVAL(READ(line), ''));
42 END;
97df14cd 43
97df14cd 44BEGIN
6a085103 45 -- initialize memory pools
0fc03918 46 M := types.mem_new();
6a085103 47 H := types.map_entry_table();
0fc03918 48
9fc524f1 49 WHILE true LOOP
97df14cd 50 BEGIN
02936b42
JM
51 line := io.readline('user> ', 0);
52 IF line = EMPTY_CLOB() THEN CONTINUE; END IF;
97df14cd 53 IF line IS NOT NULL THEN
02936b42 54 io.writeline(REP(line));
97df14cd
JM
55 END IF;
56
57 EXCEPTION WHEN OTHERS THEN
150011e4 58 IF SQLCODE = -20001 THEN -- io streams closed
97df14cd
JM
59 RETURN 0;
60 END IF;
02936b42
JM
61 io.writeline('Error: ' || SQLERRM);
62 io.writeline(dbms_utility.format_error_backtrace);
97df14cd
JM
63 END;
64 END LOOP;
65END;
7836cfa3 66
0fc03918 67END mal;
97df14cd 68/
7836cfa3 69show errors;
97df14cd
JM
70
71quit;