plsql: stepA basics. Fix step6 argument processing.
[jackhill/mal.git] / plsql / step0_repl.sql
1 --\i init.sql
2 @io.sql
3
4 CREATE OR REPLACE PACKAGE mal IS
5
6 FUNCTION MAIN(args varchar DEFAULT '()') RETURN integer;
7
8 END mal;
9 /
10
11 CREATE OR REPLACE PACKAGE BODY mal IS
12
13 FUNCTION MAIN(args varchar DEFAULT '()') RETURN integer IS
14 line varchar2(4000);
15
16 -- read
17 FUNCTION READ(line varchar) RETURN varchar IS
18 BEGIN
19 RETURN line;
20 END;
21
22 -- eval
23 FUNCTION EVAL(ast varchar, env varchar) RETURN varchar IS
24 BEGIN
25 RETURN ast;
26 END;
27
28 -- print
29 FUNCTION PRINT(exp varchar) RETURN varchar IS
30 BEGIN
31 RETURN exp;
32 END;
33
34 -- repl
35 FUNCTION REP(line varchar) RETURN varchar IS
36 BEGIN
37 RETURN PRINT(EVAL(READ(line), ''));
38 END;
39
40 BEGIN
41 WHILE true LOOP
42 BEGIN
43 line := stream_readline('user> ', 0);
44 IF line IS NULL THEN CONTINUE; END IF;
45 IF line IS NOT NULL THEN
46 stream_writeline(REP(line));
47 END IF;
48
49 EXCEPTION WHEN OTHERS THEN
50 IF SQLCODE = -20001 THEN -- io streams closed
51 RETURN 0;
52 END IF;
53 stream_writeline('Error: ' || SQLERRM);
54 stream_writeline(dbms_utility.format_error_backtrace);
55 END;
56 END LOOP;
57 END;
58
59 END mal;
60 /
61 show errors;
62
63 quit;