plsql (Oracle PL/SQL): Copy plpgsql. Step0,1 basics.
[jackhill/mal.git] / plsql / step0_repl.sql
1 --\i init.sql
2 @io.sql
3
4 -- ---------------------------------------------------------
5 -- step0_repl.sql
6
7 -- read
8 CREATE OR REPLACE FUNCTION READ(line varchar)
9 RETURN varchar IS
10 BEGIN
11 RETURN line;
12 END;
13 /
14
15 -- eval
16 CREATE OR REPLACE FUNCTION EVAL(ast varchar, env varchar)
17 RETURN varchar IS
18 BEGIN
19 RETURN ast;
20 END;
21 /
22
23 -- print
24 CREATE OR REPLACE FUNCTION PRINT(exp varchar)
25 RETURN varchar IS
26 BEGIN
27 RETURN exp;
28 END;
29 /
30
31
32 -- repl
33
34 -- stub to support wrap.sh
35 CREATE OR REPLACE PROCEDURE env_vset(env integer, name varchar, val varchar)
36 IS
37 BEGIN
38 RETURN;
39 END;
40 /
41
42
43 CREATE OR REPLACE FUNCTION REP(line varchar)
44 RETURN varchar IS
45 BEGIN
46 RETURN PRINT(EVAL(READ(line), ''));
47 END;
48 /
49
50 CREATE OR REPLACE FUNCTION MAIN_LOOP(pwd varchar)
51 RETURN integer IS
52 line varchar2(4000);
53 output varchar2(4000);
54 BEGIN
55 WHILE true
56 LOOP
57 BEGIN
58 line := stream_readline('user> ', 0);
59 -- stream_writeline('line: [' || line || ']', 1);
60 IF line IS NULL THEN RETURN 0; END IF;
61 IF line IS NOT NULL THEN
62 output := REP(line);
63 stream_writeline(output);
64 END IF;
65
66 EXCEPTION WHEN OTHERS THEN
67 IF SQLCODE = -20000 THEN
68 RETURN 0;
69 END IF;
70 stream_writeline('Error: ' || SQLERRM);
71 END;
72 END LOOP;
73 END;
74 /
75
76 quit;