@@ -246,7 +246,7 @@ package body reader is
246246 end if ;
247247 end procedure read_atom;
248248
249- procedure read_sequence(list_type: in mal_type_tag; end_ch: in string ; r: inout reader_class; result: out mal_val_ptr ; err: out mal_val_ptr) is
249+ procedure read_sequence(end_ch: in string ; r: inout reader_class; result: out mal_seq_ptr ; err: out mal_val_ptr) is
250250 variable token: line ;
251251 variable element, sub_err: mal_val_ptr;
252252 variable seq: mal_seq_ptr;
@@ -270,9 +270,50 @@ package body reader is
270270 return ;
271271 end if ;
272272 reader_next(r, token); -- Consume the close paren
273- new_seq_obj(list_type, seq, result) ;
273+ result := seq ;
274274 end procedure read_sequence;
275275
276+ procedure read_list(r: inout reader_class; result: out mal_seq_ptr; err: out mal_val_ptr) is
277+ variable seq: mal_seq_ptr;
278+ variable sub_err: mal_val_ptr;
279+ begin
280+ read_sequence(" )" , r, seq, sub_err);
281+ if sub_err = null then
282+ new_seq_obj(mal_list, seq, result);
283+ else
284+ err := sub_err;
285+ result := null ;
286+ end if ;
287+ end procedure read_list;
288+
289+ procedure read_vector(r: inout reader_class; result: out mal_seq_ptr; err: out mal_val_ptr) is
290+ variable seq: mal_seq_ptr;
291+ variable sub_err: mal_val_ptr;
292+ begin
293+ read_sequence(" ]" , r, seq, sub_err);
294+ if sub_err = null then
295+ new_seq_obj(mal_vector, seq, result);
296+ else
297+ err := sub_err;
298+ result := null ;
299+ end if ;
300+ end procedure read_vector;
301+
302+ procedure read_map(r: inout reader_class; result: out mal_val_ptr; err: out mal_val_ptr) is
303+ variable seq: mal_seq_ptr;
304+ variable sub_err, new_map: mal_val_ptr;
305+ begin
306+ read_sequence(" }" , r, seq, sub_err);
307+ if sub_err = null then
308+ new_empty_hashmap(new_map);
309+ hashmap_extend(new_map, seq.all );
310+ result := new_map;
311+ else
312+ err := sub_err;
313+ result := null ;
314+ end if ;
315+ end procedure read_map;
316+
276317 procedure reader_macro(r: inout reader_class; result: out mal_val_ptr; err: out mal_val_ptr; sym_name: in string ) is
277318 variable token, sym_line: line ;
278319 variable seq: mal_seq_ptr;
@@ -339,11 +380,11 @@ package body reader is
339380 end if ;
340381 when ' ^' => with_meta_reader_macro(r, result, err);
341382 when ' @' => reader_macro(r, result, err, " deref" );
342- when ' (' => read_sequence(mal_list, " ) " , r, result, err);
383+ when ' (' => read_list( r, result, err);
343384 when ' )' => new_string(" unexcepted ')'" , err);
344- when ' [' => read_sequence(mal_vector, " ] " , r, result, err);
385+ when ' [' => read_vector( r, result, err);
345386 when ' ]' => new_string(" unexcepted ']'" , err);
346- when ' {' => read_sequence(mal_hashmap, " } " , r, result, err);
387+ when ' {' => read_map( r, result, err);
347388 when ' }' => new_string(" unexcepted '}'" , err);
348389 when others => read_atom(r, result, err);
349390 end case ;
0 commit comments