6 -- ---------------------------------------------------------
7 -- step1_read_print.sql
10 CREATE OR REPLACE FUNCTION READ(line
varchar) RETURNS integer AS $$
12 RETURN read_str(line
);
13 END; $$
LANGUAGE plpgsql
;
16 CREATE OR REPLACE FUNCTION just_add(args
integer[]) RETURNS integer AS $$
17 BEGIN RETURN args
[1] + args
[2]; END; $$
LANGUAGE plpgsql
;
19 CREATE OR REPLACE FUNCTION eval_ast(ast
integer, env
integer) RETURNS integer AS $$
26 dst_coll_id
integer = NULL;
30 SELECT type_id
INTO type FROM value WHERE value_id
= ast
;
34 symkey
:= _vstring(ast
);
35 SELECT e.value_id
FROM env e
INTO result
38 IF result IS NULL THEN
39 RAISE
EXCEPTION '''%'' not found', symkey
;
42 WHEN type = 8 OR type = 9 THEN
44 src_coll_id
:= (SELECT collection_id
FROM value WHERE value_id
= ast
);
45 FOR vid
, i
IN (SELECT value_id
, idx
FROM collection
46 WHERE collection_id
= src_coll_id
)
49 IF dst_coll_id
IS NULL THEN
50 dst_coll_id
:= COALESCE((SELECT Max(collection_id
)
51 FROM collection
)+1,0);
53 -- Evaluated each entry
54 INSERT INTO collection (collection_id
, idx
, value_id
)
55 VALUES (dst_coll_id
, i
, e
);
57 -- Create value entry pointing to new collection
58 INSERT INTO value (type_id
, collection_id
)
59 VALUES (type, dst_coll_id
)
60 RETURNING value_id
INTO result;
67 END; $$
LANGUAGE plpgsql
;
69 CREATE OR REPLACE FUNCTION EVAL(ast
integer, env
integer) RETURNS integer AS $$
77 SELECT type_id
INTO type FROM value WHERE value_id
= ast
;
79 RETURN eval_ast(ast
, env
);
82 el
:= eval_ast(ast
, env
);
83 SELECT function_name
INTO fname
FROM value WHERE value_id
= _first(el
);
84 args
:= _restArray(el
);
85 -- RAISE NOTICE 'fname: %, args: %', fname, args;
86 EXECUTE format('SELECT %s($1);', fname
)
87 INTO result USING args
;
89 END; $$
LANGUAGE plpgsql
;
92 CREATE OR REPLACE FUNCTION PRINT(exp integer) RETURNS varchar AS $$
95 END; $$
LANGUAGE plpgsql
;
102 env_id
integer NOT NULL,
103 key varchar NOT NULL,
104 value_id
integer NOT NULL
107 CREATE OR REPLACE FUNCTION env_vset(env
integer, name varchar, val
integer)
110 INSERT INTO env (env_id
, key, value_id
) VALUES (env
, name, val
);
111 END; $$
LANGUAGE plpgsql
;
114 CREATE OR REPLACE FUNCTION mal_intop(op
varchar, args
integer[]) RETURNS integer AS $$
115 DECLARE a
integer; b
integer; result integer;
117 SELECT val_int
INTO a
FROM value WHERE value_id
= args
[1];
118 SELECT val_int
INTO b
FROM value WHERE value_id
= args
[2];
119 EXECUTE format('INSERT INTO value (type_id, val_int) VALUES (3, $1 %s $2)
120 RETURNING value_id;', op
) INTO result USING a
, b
;
122 END; $$
LANGUAGE plpgsql
;
124 CREATE OR REPLACE FUNCTION mal_add(args
integer[]) RETURNS integer AS $$
125 BEGIN RETURN mal_intop('+', args
); END; $$
LANGUAGE plpgsql
;
126 CREATE OR REPLACE FUNCTION mal_subtract(args
integer[]) RETURNS integer AS $$
127 BEGIN RETURN mal_intop('-', args
); END; $$
LANGUAGE plpgsql
;
128 CREATE OR REPLACE FUNCTION mal_multiply(args
integer[]) RETURNS integer AS $$
129 BEGIN RETURN mal_intop('*', args
); END; $$
LANGUAGE plpgsql
;
130 CREATE OR REPLACE FUNCTION mal_divide(args
integer[]) RETURNS integer AS $$
131 BEGIN RETURN mal_intop('/', args
); END; $$
LANGUAGE plpgsql
;
133 INSERT INTO value (type_id
, function_name
) VALUES (11, 'mal_add');
134 INSERT INTO value (type_id
, function_name
) VALUES (11, 'mal_subtract');
135 INSERT INTO value (type_id
, function_name
) VALUES (11, 'mal_multiply');
136 INSERT INTO value (type_id
, function_name
) VALUES (11, 'mal_divide');
138 -- repl_env is environment 0
139 SELECT env_vset(0, '+', (SELECT value_id
FROM value WHERE function_name
= 'mal_add'));
140 SELECT env_vset(0, '-', (SELECT value_id
FROM value WHERE function_name
= 'mal_subtract'));
141 SELECT env_vset(0, '*', (SELECT value_id
FROM value WHERE function_name
= 'mal_multiply'));
142 SELECT env_vset(0, '/', (SELECT value_id
FROM value WHERE function_name
= 'mal_divide'));
145 CREATE OR REPLACE FUNCTION REP(line
varchar) RETURNS varchar AS $$
149 -- RAISE NOTICE 'line is %', line;
150 -- output := 'line: ' || line;
151 RETURN PRINT(EVAL(READ(line
), 0));
152 END; $$
LANGUAGE plpgsql
;