initial vector support
This commit is contained in:
		
							parent
							
								
									49072bf5e4
								
							
						
					
					
						commit
						edcd060a8a
					
				| 
						 | 
				
			
			@ -83,6 +83,9 @@ const char *pic_symbol_name(pic_state *, pic_sym);
 | 
			
		|||
pic_value pic_str_new(pic_state *, const char *, size_t);
 | 
			
		||||
pic_value pic_str_new_cstr(pic_state *, const char *);
 | 
			
		||||
 | 
			
		||||
struct pic_vector *pic_vec_new(pic_state *, size_t);
 | 
			
		||||
struct pic_vector *pic_vec_new_from_list(pic_state *, pic_value);
 | 
			
		||||
 | 
			
		||||
bool pic_parse_file(pic_state *, FILE *file, pic_value *);
 | 
			
		||||
bool pic_parse_cstr(pic_state *, const char *, pic_value *);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,9 +36,10 @@ enum pic_tt {
 | 
			
		|||
  PIC_TT_UNDEF,
 | 
			
		||||
  /* heap */
 | 
			
		||||
  PIC_TT_PAIR,
 | 
			
		||||
  PIC_TT_STRING,
 | 
			
		||||
  PIC_TT_VECTOR,
 | 
			
		||||
  PIC_TT_PROC,
 | 
			
		||||
  PIC_TT_PORT,
 | 
			
		||||
  PIC_TT_STRING,
 | 
			
		||||
  PIC_TT_ENV
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -61,12 +62,19 @@ struct pic_string {
 | 
			
		|||
  size_t len;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct pic_vector {
 | 
			
		||||
  PIC_OBJECT_HEADER
 | 
			
		||||
  pic_value *data;
 | 
			
		||||
  size_t len;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct pic_proc;
 | 
			
		||||
struct pic_port;
 | 
			
		||||
 | 
			
		||||
#define pic_obj_ptr(o) ((struct pic_object *)(o).u.data)
 | 
			
		||||
#define pic_pair_ptr(o) ((struct pic_pair *)(o).u.data)
 | 
			
		||||
#define pic_str_ptr(o) ((struct pic_string *)(o).u.data)
 | 
			
		||||
#define pic_vec_ptr(o) ((struct pic_vector *)(o).u.data)
 | 
			
		||||
 | 
			
		||||
enum pic_tt pic_type(pic_value);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -93,5 +101,6 @@ pic_value pic_symbol_value(pic_sym);
 | 
			
		|||
#define pic_symbol_p(v) ((v).type == PIC_VTYPE_SYMBOL)
 | 
			
		||||
#define pic_pair_p(v) (pic_type(v) == PIC_TT_PAIR)
 | 
			
		||||
#define pic_str_p(v) (pic_type(v) == PIC_TT_STRING)
 | 
			
		||||
#define pic_vec_p(v) (pic_type(v) == PIC_TT_VECTOR)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -494,7 +494,8 @@ codegen(codegen_state *state, pic_value obj)
 | 
			
		|||
    irep->clen++;
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  case PIC_TT_STRING: {
 | 
			
		||||
  case PIC_TT_STRING:
 | 
			
		||||
  case PIC_TT_VECTOR: {
 | 
			
		||||
    int pidx;
 | 
			
		||||
    pidx = pic->plen++;
 | 
			
		||||
    pic->pool[pidx] = obj;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								src/gc.c
								
								
								
								
							
							
						
						
									
										12
									
								
								src/gc.c
								
								
								
								
							| 
						 | 
				
			
			@ -176,6 +176,14 @@ gc_mark_object(pic_state *pic, struct pic_object *obj)
 | 
			
		|||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  case PIC_TT_STRING: {
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  case PIC_TT_VECTOR: {
 | 
			
		||||
    int i;
 | 
			
		||||
    for (i = 0; i < ((struct pic_vector *)obj)->len; ++i) {
 | 
			
		||||
      gc_mark(pic, ((struct pic_vector *)obj)->data[i]);
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  case PIC_TT_NIL:
 | 
			
		||||
  case PIC_TT_BOOL:
 | 
			
		||||
| 
						 | 
				
			
			@ -263,6 +271,10 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj)
 | 
			
		|||
  case PIC_TT_PROC: {
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  case PIC_TT_VECTOR: {
 | 
			
		||||
    pic_free(pic, ((struct pic_vector *)obj)->data);
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  case PIC_TT_STRING: {
 | 
			
		||||
    pic_free(pic, (void*)((struct pic_string *)obj)->str);
 | 
			
		||||
    break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										24
									
								
								src/parse.y
								
								
								
								
							
							
						
						
									
										24
									
								
								src/parse.y
								
								
								
								
							| 
						 | 
				
			
			@ -37,7 +37,7 @@ void yylex_destroy();
 | 
			
		|||
  pic_value datum;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
%token tLPAREN tRPAREN tDOT
 | 
			
		||||
%token tLPAREN tRPAREN tDOT tVPAREN
 | 
			
		||||
%token tQUOTE tQUASIQUOTE tUNQUOTE tUNQUOTE_SPLICING
 | 
			
		||||
%token <i> tINT tBOOLEAN
 | 
			
		||||
%token <f> tFLOAT
 | 
			
		||||
| 
						 | 
				
			
			@ -45,7 +45,7 @@ void yylex_destroy();
 | 
			
		|||
 | 
			
		||||
%type <datum> program_data
 | 
			
		||||
%type <datum> datum simple_datum compound_datum abbrev
 | 
			
		||||
%type <datum> list list_data
 | 
			
		||||
%type <datum> list list_data vector vector_data
 | 
			
		||||
 | 
			
		||||
%%
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -116,6 +116,7 @@ simple_datum
 | 
			
		|||
 | 
			
		||||
compound_datum
 | 
			
		||||
	: list
 | 
			
		||||
	| vector
 | 
			
		||||
	| abbrev
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -141,6 +142,24 @@ list_data
 | 
			
		|||
	}
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
vector
 | 
			
		||||
	: tVPAREN vector_data tRPAREN
 | 
			
		||||
	{
 | 
			
		||||
	  $$ = pic_obj_value(pic_vec_new_from_list(p->pic, $2));
 | 
			
		||||
	}
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
vector_data
 | 
			
		||||
	: /* none */
 | 
			
		||||
	{
 | 
			
		||||
	  $$ = pic_nil_value();
 | 
			
		||||
	}
 | 
			
		||||
	| datum vector_data
 | 
			
		||||
	{
 | 
			
		||||
	  $$ = pic_cons(p->pic, $1, $2);
 | 
			
		||||
	}
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
abbrev
 | 
			
		||||
	: tQUOTE datum
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -162,6 +181,7 @@ abbrev
 | 
			
		|||
 | 
			
		||||
incomplete_datum
 | 
			
		||||
	: tLPAREN incomplete_data
 | 
			
		||||
	| tVPAREN incomplete_data
 | 
			
		||||
	| incomplete_abbrev
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								src/port.c
								
								
								
								
							
							
						
						
									
										12
									
								
								src/port.c
								
								
								
								
							| 
						 | 
				
			
			@ -11,6 +11,8 @@ static void write_str(pic_state *pic, struct pic_string *str);
 | 
			
		|||
static void
 | 
			
		||||
write(pic_state *pic, pic_value obj)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  switch (pic_type(obj)) {
 | 
			
		||||
  case PIC_TT_NIL:
 | 
			
		||||
    printf("()");
 | 
			
		||||
| 
						 | 
				
			
			@ -52,6 +54,16 @@ write(pic_state *pic, pic_value obj)
 | 
			
		|||
    write_str(pic, pic_str_ptr(obj));
 | 
			
		||||
    printf("\"");
 | 
			
		||||
    break;
 | 
			
		||||
  case PIC_TT_VECTOR:
 | 
			
		||||
    printf("#(");
 | 
			
		||||
    for (i = 0; i < pic_vec_ptr(obj)->len; ++i) {
 | 
			
		||||
      write(pic, pic_vec_ptr(obj)->data[i]);
 | 
			
		||||
      if (i + 1 < pic_vec_ptr(obj)->len) {
 | 
			
		||||
	printf(" ");
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    printf(")");
 | 
			
		||||
    break;
 | 
			
		||||
  case PIC_TT_ENV:
 | 
			
		||||
    pic_abort(pic, "logic flaw");
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,6 +41,7 @@ infnan		"+inf.0"|"-inf.0"|"+nan.0"|"-nan.0"
 | 
			
		|||
"."		return tDOT;
 | 
			
		||||
"("		return tLPAREN;
 | 
			
		||||
")"		return tRPAREN;
 | 
			
		||||
"#("		return tVPAREN;
 | 
			
		||||
"'"		return tQUOTE;
 | 
			
		||||
"`"		return tQUASIQUOTE;
 | 
			
		||||
","		return tUNQUOTE;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue