plsql: self-hosting. Long strings, refactor io.
[jackhill/mal.git] / plsql / step1_read_print.sql
index 0c462b2..08107a7 100644 (file)
@@ -5,21 +5,22 @@
 
 CREATE OR REPLACE PACKAGE mal IS
 
-FUNCTION MAIN(pwd varchar) RETURN integer;
+FUNCTION MAIN(args varchar DEFAULT '()') RETURN integer;
 
 END mal;
 /
 
 CREATE OR REPLACE PACKAGE BODY mal IS
 
-FUNCTION MAIN(pwd varchar) RETURN integer IS
-    M         mem_type;
-    line      varchar2(4000);
+FUNCTION MAIN(args varchar DEFAULT '()') RETURN integer IS
+    M         mem_type;                 -- general mal value memory pool
+    H         types.map_entry_table;    -- hashmap memory pool
+    line      CLOB;
 
     -- read
     FUNCTION READ(line varchar) RETURN integer IS
     BEGIN
-        RETURN reader.read_str(M, line);
+        RETURN reader.read_str(M, H, line);
     END;
 
     -- eval
@@ -31,7 +32,7 @@ FUNCTION MAIN(pwd varchar) RETURN integer IS
     -- print
     FUNCTION PRINT(exp integer) RETURN varchar IS
     BEGIN
-        RETURN printer.pr_str(M, exp);
+        RETURN printer.pr_str(M, H, exp);
     END;
 
     -- repl
@@ -41,22 +42,24 @@ FUNCTION MAIN(pwd varchar) RETURN integer IS
     END;
 
 BEGIN
+    -- initialize memory pools
     M := types.mem_new();
+    H := types.map_entry_table();
 
     WHILE true LOOP
         BEGIN
-            line := stream_readline('user> ', 0);
-            IF line IS NULL THEN CONTINUE; END IF;
+            line := io.readline('user> ', 0);
+            IF line = EMPTY_CLOB() THEN CONTINUE; END IF;
             IF line IS NOT NULL THEN
-                stream_writeline(REP(line));
+                io.writeline(REP(line));
             END IF;
 
             EXCEPTION WHEN OTHERS THEN
                 IF SQLCODE = -20001 THEN  -- io streams closed
                     RETURN 0;
                 END IF;
-                stream_writeline('Error: ' || SQLERRM);
-                stream_writeline(dbms_utility.format_error_backtrace);
+                io.writeline('Error: ' || SQLERRM);
+                io.writeline(dbms_utility.format_error_backtrace);
         END;
     END LOOP;
 END;