change pic_add_identifier's behavior
This commit is contained in:
		
							parent
							
								
									1a8bc0bc66
								
							
						
					
					
						commit
						8d17bf3175
					
				|  | @ -116,7 +116,7 @@ analyzer_scope_destroy(pic_state *PIC_UNUSED(pic), analyze_scope *PIC_UNUSED(sco | |||
| } | ||||
| 
 | ||||
| static bool | ||||
| search_scope(pic_state *pic, analyze_scope *scope, pic_value sym) | ||||
| find_local_var(pic_state *pic, analyze_scope *scope, pic_value sym) | ||||
| { | ||||
|   return pic_dict_has(pic, scope->args, sym) || pic_dict_has(pic, scope->locals, sym) || scope->depth == 0; | ||||
| } | ||||
|  | @ -127,7 +127,7 @@ find_var(pic_state *pic, analyze_scope *scope, pic_value sym) | |||
|   int depth = 0; | ||||
| 
 | ||||
|   while (scope) { | ||||
|     if (search_scope(pic, scope, sym)) { | ||||
|     if (find_local_var(pic, scope, sym)) { | ||||
|       if (depth > 0) { | ||||
|         pic_dict_set(pic, scope->captures, sym, pic_true_value(pic)); /* capture! */ | ||||
|       } | ||||
|  | @ -144,7 +144,7 @@ define_var(pic_state *pic, analyze_scope *scope, pic_value sym) | |||
| { | ||||
|   if (scope->depth > 0) { | ||||
|     /* local */ | ||||
|     if (search_scope(pic, scope, sym)) { | ||||
|     if (find_local_var(pic, scope, sym)) { | ||||
|       pic_warnf(pic, "redefining variable: ~s", sym); | ||||
|       return; | ||||
|     } | ||||
|  |  | |||
|  | @ -179,7 +179,7 @@ pic_value pic_make_error(pic_state *, const char *type, const char *msg, pic_val | |||
| pic_value pic_make_rec(pic_state *, pic_value type, pic_value datum); | ||||
| 
 | ||||
| pic_value pic_add_identifier(pic_state *, pic_value id, pic_value env); | ||||
| pic_value pic_put_identifier(pic_state *, pic_value id, pic_value uid, pic_value env); | ||||
| void pic_put_identifier(pic_state *, pic_value id, pic_value uid, pic_value env); | ||||
| pic_value pic_find_identifier(pic_state *, pic_value id, pic_value env); | ||||
| pic_value pic_id_name(pic_state *, pic_value id); | ||||
| 
 | ||||
|  |  | |||
|  | @ -22,36 +22,6 @@ pic_make_env(pic_state *pic, pic_value up) | |||
|   return pic_obj_value(env); | ||||
| } | ||||
| 
 | ||||
| pic_value | ||||
| pic_add_identifier(pic_state *pic, pic_value id, pic_value env) | ||||
| { | ||||
|   const char *name; | ||||
|   pic_value uid, str; | ||||
| 
 | ||||
|   name = pic_str(pic, pic_id_name(pic, id)); | ||||
| 
 | ||||
|   if (pic_env_ptr(pic, env)->up == NULL && pic_sym_p(pic, id)) { /* toplevel & public */ | ||||
|     str = pic_strf_value(pic, "~a/%s", pic_obj_value(pic_env_ptr(pic, env)->lib), name); | ||||
|   } else { | ||||
|     str = pic_strf_value(pic, ".%s.%d", name, pic->ucnt++); | ||||
|   } | ||||
|   uid = pic_intern(pic, str); | ||||
| 
 | ||||
|   return pic_put_identifier(pic, id, uid, env); | ||||
| } | ||||
| 
 | ||||
| pic_value | ||||
| pic_put_identifier(pic_state *pic, pic_value id, pic_value uid, pic_value env) | ||||
| { | ||||
|   int it; | ||||
|   int ret; | ||||
| 
 | ||||
|   it = kh_put(env, &pic_env_ptr(pic, env)->map, pic_id_ptr(pic, id), &ret); | ||||
|   kh_val(&pic_env_ptr(pic, env)->map, it) = pic_sym_ptr(pic, uid); | ||||
| 
 | ||||
|   return uid; | ||||
| } | ||||
| 
 | ||||
| static bool | ||||
| search_scope(pic_state *pic, pic_value id, pic_value env, pic_value *uid) | ||||
| { | ||||
|  | @ -103,6 +73,39 @@ pic_find_identifier(pic_state *pic, pic_value id, pic_value env) | |||
|   return uid; | ||||
| } | ||||
| 
 | ||||
| pic_value | ||||
| pic_add_identifier(pic_state *pic, pic_value id, pic_value env) | ||||
| { | ||||
|   const char *name; | ||||
|   pic_value uid, str; | ||||
| 
 | ||||
|   if (search_scope(pic, id, env, &uid)) { | ||||
|     return uid; | ||||
|   } | ||||
| 
 | ||||
|   name = pic_str(pic, pic_id_name(pic, id)); | ||||
| 
 | ||||
|   if (pic_env_ptr(pic, env)->up == NULL && pic_sym_p(pic, id)) { /* toplevel & public */ | ||||
|     str = pic_strf_value(pic, "~a/%s", pic_obj_value(pic_env_ptr(pic, env)->lib), name); | ||||
|   } else { | ||||
|     str = pic_strf_value(pic, ".%s.%d", name, pic->ucnt++); | ||||
|   } | ||||
|   uid = pic_intern(pic, str); | ||||
| 
 | ||||
|   pic_put_identifier(pic, id, uid, env); | ||||
| 
 | ||||
|   return uid; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| pic_put_identifier(pic_state *pic, pic_value id, pic_value uid, pic_value env) | ||||
| { | ||||
|   int it, ret; | ||||
| 
 | ||||
|   it = kh_put(env, &pic_env_ptr(pic, env)->map, pic_id_ptr(pic, id), &ret); | ||||
|   kh_val(&pic_env_ptr(pic, env)->map, it) = pic_sym_ptr(pic, uid); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
|  * macro expander | ||||
|  | @ -238,14 +241,12 @@ expand_lambda(pic_state *pic, pic_value expr, pic_value env) | |||
| static pic_value | ||||
| expand_define(pic_state *pic, pic_value expr, pic_value env, pic_value deferred) | ||||
| { | ||||
|   pic_value id, uid, val; | ||||
|   pic_value uid, val; | ||||
| 
 | ||||
|   uid = pic_add_identifier(pic, pic_list_ref(pic, expr, 1), env); | ||||
| 
 | ||||
|   shadow_macro(pic, uid); | ||||
| 
 | ||||
|   id = pic_cadr(pic, expr); | ||||
|   if (! search_scope(pic, id, env, &uid)) { | ||||
|     uid = pic_add_identifier(pic, id, env); | ||||
|   } else { | ||||
|     shadow_macro(pic, uid); | ||||
|   } | ||||
|   val = expand(pic, pic_list_ref(pic, expr, 2), env, deferred); | ||||
| 
 | ||||
|   return pic_list(pic, 3, S("define"), uid, val); | ||||
|  | @ -255,16 +256,13 @@ static pic_value | |||
| expand_defmacro(pic_state *pic, pic_value expr, pic_value env) | ||||
| { | ||||
|   pic_value pic_compile(pic_state *, pic_value); | ||||
|   pic_value id, uid, val; | ||||
|   pic_value uid, val; | ||||
| 
 | ||||
|   id = pic_cadr(pic, expr); | ||||
|   if (! search_scope(pic, id, env, &uid)) { | ||||
|     uid = pic_add_identifier(pic, id, env); | ||||
|   } | ||||
|   uid = pic_add_identifier(pic, pic_list_ref(pic, expr, 1), env); | ||||
| 
 | ||||
|   val = pic_call(pic, pic_compile(pic, pic_expand(pic, pic_list_ref(pic, expr, 2), env)), 0); | ||||
|   if (! pic_proc_p(pic, val)) { | ||||
|     pic_errorf(pic, "macro definition \"~s\" evaluates to non-procedure object", id); | ||||
|     pic_errorf(pic, "macro definition \"~s\" evaluates to non-procedure object", pic_list_ref(pic, expr, 1)); | ||||
|   } | ||||
| 
 | ||||
|   define_macro(pic, uid, val); | ||||
|  |  | |||
|  | @ -352,18 +352,6 @@ pic_close(pic_state *pic) | |||
|   /* free all heap objects */ | ||||
|   pic_gc(pic); | ||||
| 
 | ||||
| #if 0 | ||||
|   { | ||||
|     /* FIXME */ | ||||
|     int i = 0; | ||||
|     struct list_head *list; | ||||
|     for (list = pic->ireps.next; list != &pic->ireps; list = list->next) { | ||||
|       i++; | ||||
|     } | ||||
|     printf("%d\n", i); | ||||
|   } | ||||
| #endif | ||||
| 
 | ||||
|   /* flush all xfiles */ | ||||
|   xfflush(pic, NULL); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki