diff --git a/src/array.h b/src/array.h index 313e5af..8f7467f 100644 --- a/src/array.h +++ b/src/array.h @@ -189,7 +189,10 @@ struct array { } } - inline array_p atom_i(size_t i) const { return atom(t, data_i(i)); } + inline array_p atom_i(size_t i) const { + if (t == T_ARR) return data()[i]; + else return atom(t, data_i(i)); + } inline array_p tail() const { return create(t, n - 1, data_i(1)); } }; @@ -204,12 +207,3 @@ using array_p = rc; #define DO_MUT_ARRAY(a, typ, i, p) _DO_ARRAY_IMPL(a, i, p, UNIQUE(__), auto& p = a->mut_data()[i]) #define DO_ARRAY(a, t, i, p) _DO_ARRAY_IMPL(a, i, p, UNIQUE(__), auto p = a->data()[i]) - -template -inline void array::for_each_atom(Fn callback) const { - if (t != T_ARR) { - DO(i, n) { callback(i, array::atom_i(i)); } - } else { - DO_ARRAY(this, arr_t, i, e) { callback(i, e); } - } -} diff --git a/src/words.c++ b/src/words.c++ index 5906910..5217194 100644 --- a/src/words.c++ +++ b/src/words.c++ @@ -666,24 +666,22 @@ DEF_WORD("\\s", slash_stack) { DEF_WORD(",fold", fold) { POP(y); POP(x); - t_dict_entry e = as_dict_entry(y); - auto iter = [&](size_t i, array_p slice) mutable { - PUSH(slice); + t_dict_entry e = as_dict_entry(y); + DO(i, x->n) { + PUSH(x->atom_i(i)); if (i > 0) inter.entry(e); - }; - x->for_each_atom(iter); + } } DEF_WORD(",scan", scan) { POP(y); POP(x); - t_dict_entry e = as_dict_entry(y); - auto iter = [&](size_t i, array_p slice) mutable { + t_dict_entry e = as_dict_entry(y); + DO(i, x->n) { if (i > 0) DUP; - PUSH(slice); + PUSH(x->atom_i(i)); if (i > 0) inter.entry(e); - }; - x->for_each_atom(iter); + } array_p result = cat(stack, x->n); PUSH(result); } @@ -691,12 +689,11 @@ DEF_WORD(",scan", scan) { DEF_WORD(",apply", apply) { POP(y); POP(x); - t_dict_entry e = as_dict_entry(y); - auto iter = [&](size_t i, array_p slice) mutable { - PUSH(slice); + t_dict_entry e = as_dict_entry(y); + DO(i, x->n) { + PUSH(x->atom_i(i)); inter.entry(e); }; - x->for_each_atom(iter); array_p result = cat(stack, x->n); PUSH(result); } @@ -704,13 +701,12 @@ DEF_WORD(",apply", apply) { DEF_WORD(",pairwise", pairwise) { POP(y); POP(x); - t_dict_entry e = as_dict_entry(y); - auto iter = [&](size_t i, array_p slice) mutable { - PUSH(slice); + t_dict_entry e = as_dict_entry(y); + DO(i, x->n) { + PUSH(x->atom_i(i)); if (i > 0) inter.entry(e); - PUSH(slice); + PUSH(x->atom_i(i)); }; - x->for_each_atom(iter); DROP; array_p result = cat(stack, x->n); PUSH(result);