change pic_for_each interface

This commit is contained in:
Yuichi Nishiwaki 2015-01-22 19:28:31 +09:00
parent 1b637d1763
commit e3833eb039
12 changed files with 52 additions and 55 deletions

View File

@ -203,7 +203,7 @@ pic_blob_list_to_bytevector(pic_state *pic)
{ {
pic_blob *blob; pic_blob *blob;
unsigned char *data; unsigned char *data;
pic_value list, e; pic_value list, e, it;
pic_get_args(pic, "o", &list); pic_get_args(pic, "o", &list);
@ -211,7 +211,7 @@ pic_blob_list_to_bytevector(pic_state *pic)
data = blob->data; data = blob->data;
pic_for_each (e, list) { pic_for_each (e, list, it) {
pic_assert_type(pic, e, int); pic_assert_type(pic, e, int);
if (pic_int(e) < 0 || pic_int(e) > 255) if (pic_int(e) < 0 || pic_int(e) > 255)

View File

@ -344,9 +344,9 @@ static void
analyze_deferred(analyze_state *state) analyze_deferred(analyze_state *state)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
pic_value defer, val, name, formal, body, dst; pic_value defer, val, name, formal, body, dst, it;
pic_for_each (defer, pic_reverse(pic, state->scope->defer)) { pic_for_each (defer, pic_reverse(pic, state->scope->defer), it) {
name = pic_list_ref(pic, defer, 0); name = pic_list_ref(pic, defer, 0);
formal = pic_list_ref(pic, defer, 1); formal = pic_list_ref(pic, defer, 1);
body = pic_list_ref(pic, defer, 2); body = pic_list_ref(pic, defer, 2);
@ -566,7 +566,7 @@ analyze_quote(analyze_state *state, pic_value obj)
#define FOLD_ARGS(sym) do { \ #define FOLD_ARGS(sym) do { \
obj = analyze(state, pic_car(pic, args), false); \ obj = analyze(state, pic_car(pic, args), false); \
pic_for_each (arg, pic_cdr(pic, args)) { \ pic_for_each (arg, pic_cdr(pic, args), it) { \
obj = pic_list3(pic, pic_obj_value(sym), obj, \ obj = pic_list3(pic, pic_obj_value(sym), obj, \
analyze(state, arg, false)); \ analyze(state, arg, false)); \
} \ } \
@ -576,7 +576,7 @@ static pic_value
analyze_add(analyze_state *state, pic_value obj, bool tailpos) analyze_add(analyze_state *state, pic_value obj, bool tailpos)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
pic_value args, arg; pic_value args, arg, it;
ARGC_ASSERT_GE(0); ARGC_ASSERT_GE(0);
switch (pic_length(pic, obj)) { switch (pic_length(pic, obj)) {
@ -595,7 +595,7 @@ static pic_value
analyze_sub(analyze_state *state, pic_value obj) analyze_sub(analyze_state *state, pic_value obj)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
pic_value args, arg; pic_value args, arg, it;
ARGC_ASSERT_GE(1); ARGC_ASSERT_GE(1);
switch (pic_length(pic, obj)) { switch (pic_length(pic, obj)) {
@ -613,7 +613,7 @@ static pic_value
analyze_mul(analyze_state *state, pic_value obj, bool tailpos) analyze_mul(analyze_state *state, pic_value obj, bool tailpos)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
pic_value args, arg; pic_value args, arg, it;
ARGC_ASSERT_GE(0); ARGC_ASSERT_GE(0);
switch (pic_length(pic, obj)) { switch (pic_length(pic, obj)) {
@ -632,7 +632,7 @@ static pic_value
analyze_div(analyze_state *state, pic_value obj) analyze_div(analyze_state *state, pic_value obj)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
pic_value args, arg; pic_value args, arg, it;
ARGC_ASSERT_GE(1); ARGC_ASSERT_GE(1);
switch (pic_length(pic, obj)) { switch (pic_length(pic, obj)) {
@ -651,7 +651,7 @@ static pic_value
analyze_call(analyze_state *state, pic_value obj, bool tailpos) analyze_call(analyze_state *state, pic_value obj, bool tailpos)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
pic_value seq, elt; pic_value seq, elt, it;
pic_sym *call; pic_sym *call;
if (! tailpos) { if (! tailpos) {
@ -660,7 +660,7 @@ analyze_call(analyze_state *state, pic_value obj, bool tailpos)
call = pic->sTAILCALL; call = pic->sTAILCALL;
} }
seq = pic_list1(pic, pic_obj_value(call)); seq = pic_list1(pic, pic_obj_value(call));
pic_for_each (elt, obj) { pic_for_each (elt, obj, it) {
seq = pic_cons(pic, analyze(state, elt, false), seq); seq = pic_cons(pic, analyze(state, elt, false), seq);
} }
return pic_reverse(pic, seq); return pic_reverse(pic, seq);
@ -670,14 +670,14 @@ static pic_value
analyze_values(analyze_state *state, pic_value obj, bool tailpos) analyze_values(analyze_state *state, pic_value obj, bool tailpos)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
pic_value v, seq; pic_value v, seq, it;
if (! tailpos) { if (! tailpos) {
return analyze_call(state, obj, false); return analyze_call(state, obj, false);
} }
seq = pic_list1(pic, pic_obj_value(pic->sRETURN)); seq = pic_list1(pic, pic_obj_value(pic->sRETURN));
pic_for_each (v, pic_cdr(pic, obj)) { pic_for_each (v, pic_cdr(pic, obj), it) {
seq = pic_cons(pic, analyze(state, v, false), seq); seq = pic_cons(pic, analyze(state, v, false), seq);
} }
return pic_reverse(pic, seq); return pic_reverse(pic, seq);
@ -964,7 +964,7 @@ push_codegen_context(codegen_state *state, pic_value name, pic_value args, pic_v
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
codegen_context *cxt; codegen_context *cxt;
pic_value var; pic_value var, it;
pic_sym *sym; pic_sym *sym;
assert(pic_sym_p(name) || pic_false_p(name)); assert(pic_sym_p(name) || pic_false_p(name));
@ -980,15 +980,15 @@ push_codegen_context(codegen_state *state, pic_value name, pic_value args, pic_v
xv_init(&cxt->locals, sizeof(pic_sym *)); xv_init(&cxt->locals, sizeof(pic_sym *));
xv_init(&cxt->captures, sizeof(pic_sym *)); xv_init(&cxt->captures, sizeof(pic_sym *));
pic_for_each (var, args) { pic_for_each (var, args, it) {
sym = pic_sym_ptr(var); sym = pic_sym_ptr(var);
xv_push(&cxt->args, &sym); xv_push(&cxt->args, &sym);
} }
pic_for_each (var, locals) { pic_for_each (var, locals, it) {
sym = pic_sym_ptr(var); sym = pic_sym_ptr(var);
xv_push(&cxt->locals, &sym); xv_push(&cxt->locals, &sym);
} }
pic_for_each (var, captures) { pic_for_each (var, captures, it) {
sym = pic_sym_ptr(var); sym = pic_sym_ptr(var);
xv_push(&cxt->captures, &sym); xv_push(&cxt->captures, &sym);
} }
@ -1240,10 +1240,10 @@ codegen(codegen_state *state, pic_value obj)
return; return;
} }
else if (sym == pic->sBEGIN) { else if (sym == pic->sBEGIN) {
pic_value elt; pic_value elt, it;
int i = 0; int i = 0;
pic_for_each (elt, pic_cdr(pic, obj)) { pic_for_each (elt, pic_cdr(pic, obj), it) {
if (i++ != 0) { if (i++ != 0) {
cxt->code[cxt->clen].insn = OP_POP; cxt->code[cxt->clen].insn = OP_POP;
cxt->clen++; cxt->clen++;
@ -1406,9 +1406,9 @@ codegen(codegen_state *state, pic_value obj)
} }
else if (sym == pic->sCALL || sym == pic->sTAILCALL) { else if (sym == pic->sCALL || sym == pic->sTAILCALL) {
int len = (int)pic_length(pic, obj); int len = (int)pic_length(pic, obj);
pic_value elt; pic_value elt, it;
pic_for_each (elt, pic_cdr(pic, obj)) { pic_for_each (elt, pic_cdr(pic, obj), it) {
codegen(state, elt); codegen(state, elt);
} }
cxt->code[cxt->clen].insn = (sym == pic->sCALL) ? OP_CALL : OP_TAILCALL; cxt->code[cxt->clen].insn = (sym == pic->sCALL) ? OP_CALL : OP_TAILCALL;
@ -1432,9 +1432,9 @@ codegen(codegen_state *state, pic_value obj)
} }
else if (sym == pic->sRETURN) { else if (sym == pic->sRETURN) {
int len = (int)pic_length(pic, obj); int len = (int)pic_length(pic, obj);
pic_value elt; pic_value elt, it;
pic_for_each (elt, pic_cdr(pic, obj)) { pic_for_each (elt, pic_cdr(pic, obj), it) {
codegen(state, elt); codegen(state, elt);
} }
cxt->code[cxt->clen].insn = OP_RET; cxt->code[cxt->clen].insn = OP_RET;

View File

@ -195,11 +195,11 @@ pic_values_by_array(pic_state *pic, size_t argc, pic_value *argv)
pic_value pic_value
pic_values_by_list(pic_state *pic, pic_value list) pic_values_by_list(pic_state *pic, pic_value list)
{ {
pic_value v; pic_value v, it;
int i; int i;
i = 0; i = 0;
pic_for_each (v, list) { pic_for_each (v, list, it) {
pic->sp[i++] = v; pic->sp[i++] = v;
} }
pic->ci->retc = i; pic->ci->retc = i;

View File

@ -273,13 +273,13 @@ static pic_value
pic_dict_alist_to_dictionary(pic_state *pic) pic_dict_alist_to_dictionary(pic_state *pic)
{ {
struct pic_dict *dict; struct pic_dict *dict;
pic_value alist, e; pic_value alist, e, it;
pic_get_args(pic, "o", &alist); pic_get_args(pic, "o", &alist);
dict = pic_make_dict(pic); dict = pic_make_dict(pic);
pic_for_each (e, pic_reverse(pic, alist)) { pic_for_each (e, pic_reverse(pic, alist), it) {
pic_assert_type(pic, pic_car(pic, e), sym); pic_assert_type(pic, pic_car(pic, e), sym);
pic_dict_set(pic, dict, pic_sym_ptr(pic_car(pic, e)), pic_cdr(pic, e)); pic_dict_set(pic, dict, pic_sym_ptr(pic_car(pic, e)), pic_cdr(pic, e));
} }

View File

@ -59,12 +59,9 @@ pic_value pic_list7(pic_state *, pic_value, pic_value, pic_value, pic_value, pic
pic_value pic_list_by_array(pic_state *, size_t, pic_value *); pic_value pic_list_by_array(pic_state *, size_t, pic_value *);
pic_value pic_make_list(pic_state *, size_t, pic_value); pic_value pic_make_list(pic_state *, size_t, pic_value);
#define pic_for_each(var, list) \ #define pic_for_each(var, list, it) \
pic_for_each_helper_(var, PIC_GENSYM(tmp), list) for (it = (list); ! pic_nil_p(it); it = pic_cdr(pic, it)) \
#define pic_for_each_helper_(var, tmp, list) \ if ((var = pic_car(pic, it)), true)
for (pic_value tmp = (list); \
pic_nil_p(tmp) ? false : ((var = pic_car(pic, tmp)), true); \
tmp = pic_cdr(pic, tmp))
#define pic_push(pic, item, place) (place = pic_cons(pic, item, place)) #define pic_push(pic, item, place) (place = pic_cons(pic, item, place))
#define pic_pop(pic, place) (place = pic_cdr(pic, place)) #define pic_pop(pic, place) (place = pic_cdr(pic, place))

View File

@ -73,7 +73,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports)
{ {
struct pic_lib *lib; struct pic_lib *lib;
struct pic_dict *table; struct pic_dict *table;
pic_value val, tmp, prefix; pic_value val, tmp, prefix, it;
pic_sym *sym, *id, *tag; pic_sym *sym, *id, *tag;
table = pic_make_dict(pic); table = pic_make_dict(pic);
@ -85,7 +85,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports)
if (tag == pic->sONLY) { if (tag == pic->sONLY) {
import_table(pic, pic_cadr(pic, spec), table); import_table(pic, pic_cadr(pic, spec), table);
pic_for_each (val, pic_cddr(pic, spec)) { pic_for_each (val, pic_cddr(pic, spec), it) {
pic_dict_set(pic, imports, pic_sym_ptr(val), pic_dict_ref(pic, table, pic_sym_ptr(val))); pic_dict_set(pic, imports, pic_sym_ptr(val), pic_dict_ref(pic, table, pic_sym_ptr(val)));
} }
return; return;
@ -93,7 +93,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports)
if (tag == pic->sRENAME) { if (tag == pic->sRENAME) {
import_table(pic, pic_cadr(pic, spec), imports); import_table(pic, pic_cadr(pic, spec), imports);
pic_for_each (val, pic_cddr(pic, spec)) { pic_for_each (val, pic_cddr(pic, spec), it) {
tmp = pic_dict_ref(pic, imports, pic_sym_ptr(pic_car(pic, val))); tmp = pic_dict_ref(pic, imports, pic_sym_ptr(pic_car(pic, val)));
pic_dict_del(pic, imports, pic_sym_ptr(pic_car(pic, val))); pic_dict_del(pic, imports, pic_sym_ptr(pic_car(pic, val)));
pic_dict_set(pic, imports, pic_sym_ptr(pic_cadr(pic, val)), tmp); pic_dict_set(pic, imports, pic_sym_ptr(pic_cadr(pic, val)), tmp);
@ -112,7 +112,7 @@ import_table(pic_state *pic, pic_value spec, struct pic_dict *imports)
} }
if (tag == pic->sEXCEPT) { if (tag == pic->sEXCEPT) {
import_table(pic, pic_cadr(pic, spec), imports); import_table(pic, pic_cadr(pic, spec), imports);
pic_for_each (val, pic_cddr(pic, spec)) { pic_for_each (val, pic_cddr(pic, spec), it) {
pic_dict_del(pic, imports, pic_sym_ptr(val)); pic_dict_del(pic, imports, pic_sym_ptr(val));
} }
return; return;
@ -202,13 +202,13 @@ static bool
condexpand(pic_state *pic, pic_value clause) condexpand(pic_state *pic, pic_value clause)
{ {
pic_sym *tag; pic_sym *tag;
pic_value c, feature; pic_value c, feature, it;
if (pic_eq_p(clause, pic_obj_value(pic->sELSE))) { if (pic_eq_p(clause, pic_obj_value(pic->sELSE))) {
return true; return true;
} }
if (pic_sym_p(clause)) { if (pic_sym_p(clause)) {
pic_for_each (feature, pic->features) { pic_for_each (feature, pic->features, it) {
if(pic_eq_p(feature, clause)) if(pic_eq_p(feature, clause))
return true; return true;
} }
@ -228,14 +228,14 @@ condexpand(pic_state *pic, pic_value clause)
return ! condexpand(pic, pic_list_ref(pic, clause, 1)); return ! condexpand(pic, pic_list_ref(pic, clause, 1));
} }
if (tag == pic->sAND) { if (tag == pic->sAND) {
pic_for_each (c, pic_cdr(pic, clause)) { pic_for_each (c, pic_cdr(pic, clause), it) {
if (! condexpand(pic, c)) if (! condexpand(pic, c))
return false; return false;
} }
return true; return true;
} }
if (tag == pic->sOR) { if (tag == pic->sOR) {
pic_for_each (c, pic_cdr(pic, clause)) { pic_for_each (c, pic_cdr(pic, clause), it) {
if (condexpand(pic, c)) if (condexpand(pic, c))
return true; return true;
} }

View File

@ -124,9 +124,9 @@ macroexpand_defer(pic_state *pic, pic_value expr, struct pic_senv *senv)
static void static void
macroexpand_deferred(pic_state *pic, struct pic_senv *senv) macroexpand_deferred(pic_state *pic, struct pic_senv *senv)
{ {
pic_value defer, val, src, dst; pic_value defer, val, src, dst, it;
pic_for_each (defer, pic_reverse(pic, senv->defer)) { pic_for_each (defer, pic_reverse(pic, senv->defer), it) {
src = pic_car(pic, defer); src = pic_car(pic, defer);
dst = pic_cdr(pic, defer); dst = pic_cdr(pic, defer);

View File

@ -204,10 +204,10 @@ pic_value
pic_reverse(pic_state *pic, pic_value list) pic_reverse(pic_state *pic, pic_value list)
{ {
size_t ai = pic_gc_arena_preserve(pic); size_t ai = pic_gc_arena_preserve(pic);
pic_value v, acc; pic_value v, acc, it;
acc = pic_nil_value(); acc = pic_nil_value();
pic_for_each(v, list) { pic_for_each(v, list, it) {
acc = pic_cons(pic, v, acc); acc = pic_cons(pic, v, acc);
pic_gc_arena_restore(pic, ai); pic_gc_arena_restore(pic, ai);
@ -220,10 +220,10 @@ pic_value
pic_append(pic_state *pic, pic_value xs, pic_value ys) pic_append(pic_state *pic, pic_value xs, pic_value ys)
{ {
size_t ai = pic_gc_arena_preserve(pic); size_t ai = pic_gc_arena_preserve(pic);
pic_value x; pic_value x, it;
xs = pic_reverse(pic, xs); xs = pic_reverse(pic, xs);
pic_for_each (x, xs) { pic_for_each (x, xs, it) {
ys = pic_cons(pic, x, ys); ys = pic_cons(pic, x, ys);
pic_gc_arena_restore(pic, ai); pic_gc_arena_restore(pic, ai);

View File

@ -425,7 +425,7 @@ static pic_value
pic_str_list_to_string(pic_state *pic) pic_str_list_to_string(pic_state *pic)
{ {
pic_str *str; pic_str *str;
pic_value list, e; pic_value list, e, it;
size_t i = 0; size_t i = 0;
pic_get_args(pic, "o", &list); pic_get_args(pic, "o", &list);
@ -435,7 +435,7 @@ pic_str_list_to_string(pic_state *pic)
} else { } else {
char buf[pic_length(pic, list)]; char buf[pic_length(pic, list)];
pic_for_each (e, list) { pic_for_each (e, list, it) {
pic_assert_type(pic, e, char); pic_assert_type(pic, e, char);
buf[i++] = pic_char(e); buf[i++] = pic_char(e);

View File

@ -302,7 +302,7 @@ static pic_value
pic_vec_list_to_vector(pic_state *pic) pic_vec_list_to_vector(pic_state *pic)
{ {
struct pic_vector *vec; struct pic_vector *vec;
pic_value list, e, *data; pic_value list, e, it, *data;
pic_get_args(pic, "o", &list); pic_get_args(pic, "o", &list);
@ -310,7 +310,7 @@ pic_vec_list_to_vector(pic_state *pic)
data = vec->data; data = vec->data;
pic_for_each (e, list) { pic_for_each (e, list, it) {
*data++ = e; *data++ = e;
} }
return pic_obj_value(vec); return pic_obj_value(vec);

View File

@ -1153,13 +1153,13 @@ pic_apply_trampoline(pic_state *pic, struct pic_proc *proc, pic_value args)
{ OP_TAILCALL, { .i = -1 } } { OP_TAILCALL, { .i = -1 } }
}; };
pic_value v, *sp; pic_value v, it, *sp;
pic_callinfo *ci; pic_callinfo *ci;
*pic->sp++ = pic_obj_value(proc); *pic->sp++ = pic_obj_value(proc);
sp = pic->sp; sp = pic->sp;
pic_for_each (v, args) { pic_for_each (v, args, it) {
*sp++ = v; *sp++ = v;
} }

View File

@ -20,11 +20,11 @@ pic_features(pic_state *pic)
static pic_value static pic_value
pic_libraries(pic_state *pic) pic_libraries(pic_state *pic)
{ {
pic_value libs = pic_nil_value(), lib; pic_value libs = pic_nil_value(), lib, it;
pic_get_args(pic, ""); pic_get_args(pic, "");
pic_for_each (lib, pic->libs) { pic_for_each (lib, pic->libs, it) {
libs = pic_cons(pic, pic_car(pic, lib), libs); libs = pic_cons(pic, pic_car(pic, lib), libs);
} }