change pic_dict_for_each interface

This commit is contained in:
Yuichi Nishiwaki 2015-01-22 19:33:42 +09:00
parent e3833eb039
commit 499b68c835
3 changed files with 10 additions and 10 deletions

View File

@ -64,6 +64,7 @@ new_analyze_state(pic_state *pic)
{ {
analyze_state *state; analyze_state *state;
pic_sym *sym; pic_sym *sym;
xh_entry *it;
state = pic_alloc(pic, sizeof(analyze_state)); state = pic_alloc(pic, sizeof(analyze_state));
state->pic = pic; state->pic = pic;
@ -92,7 +93,7 @@ new_analyze_state(pic_state *pic)
/* push initial scope */ /* push initial scope */
push_scope(state, pic_nil_value()); push_scope(state, pic_nil_value());
pic_dict_for_each (sym, pic->globals) { pic_dict_for_each (sym, pic->globals, it) {
xv_push(&state->scope->locals, &sym); xv_push(&state->scope->locals, &sym);
} }

View File

@ -19,12 +19,9 @@ struct pic_dict {
struct pic_dict *pic_make_dict(pic_state *); struct pic_dict *pic_make_dict(pic_state *);
#define pic_dict_for_each(sym, dict) \ #define pic_dict_for_each(sym, dict, it) \
pic_dict_for_each_helper_((sym), PIC_GENSYM(tmp), (dict)) for (it = xh_begin(&(dict)->hash); it != NULL; it = xh_next(it)) \
#define pic_dict_for_each_helper_(var, tmp, dict) \ if ((sym = xh_key(it, pic_sym *)), true)
for (xh_entry *tmp = xh_begin(&dict->hash); \
(tmp && ((var = xh_key(tmp, pic_sym *)), 1)); \
tmp = xh_next(tmp))
pic_value pic_dict_ref(pic_state *, struct pic_dict *, pic_sym *); pic_value pic_dict_ref(pic_state *, struct pic_dict *, pic_sym *);
void pic_dict_set(pic_state *, struct pic_dict *, pic_sym *, pic_value); void pic_dict_set(pic_state *, struct pic_dict *, pic_sym *, pic_value);

View File

@ -75,6 +75,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports)
struct pic_dict *table; struct pic_dict *table;
pic_value val, tmp, prefix, it; pic_value val, tmp, prefix, it;
pic_sym *sym, *id, *tag; pic_sym *sym, *id, *tag;
xh_entry *iter;
table = pic_make_dict(pic); table = pic_make_dict(pic);
@ -104,7 +105,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports)
import_table(pic, pic_cadr(pic, spec), table); import_table(pic, pic_cadr(pic, spec), table);
prefix = pic_list_ref(pic, spec, 2); prefix = pic_list_ref(pic, spec, 2);
pic_dict_for_each (sym, table) { pic_dict_for_each (sym, table, iter) {
id = pic_intern(pic, pic_format(pic, "~s~s", prefix, pic_obj_value(sym))); id = pic_intern(pic, pic_format(pic, "~s~s", prefix, pic_obj_value(sym)));
pic_dict_set(pic, imports, id, pic_dict_ref(pic, table, sym)); pic_dict_set(pic, imports, id, pic_dict_ref(pic, table, sym));
} }
@ -122,7 +123,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports)
if (! lib) { if (! lib) {
pic_errorf(pic, "library not found: ~a", spec); pic_errorf(pic, "library not found: ~a", spec);
} }
pic_dict_for_each (sym, lib->exports) { pic_dict_for_each (sym, lib->exports, iter) {
pic_dict_set(pic, imports, sym, pic_dict_ref(pic, lib->exports, sym)); pic_dict_set(pic, imports, sym, pic_dict_ref(pic, lib->exports, sym));
} }
} }
@ -132,12 +133,13 @@ import(pic_state *pic, pic_value spec)
{ {
struct pic_dict *imports; struct pic_dict *imports;
pic_sym *sym; pic_sym *sym;
xh_entry *it;
imports = pic_make_dict(pic); imports = pic_make_dict(pic);
import_table(pic, spec, imports); import_table(pic, spec, imports);
pic_dict_for_each (sym, imports) { pic_dict_for_each (sym, imports, it) {
pic_put_rename(pic, pic->lib->env, sym, pic_sym_ptr(pic_dict_ref(pic, imports, sym))); pic_put_rename(pic, pic->lib->env, sym, pic_sym_ptr(pic_dict_ref(pic, imports, sym)));
} }
} }