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