static val_ptr v_def_call(val_ptr v, tree_ptr t) { int i; const char* name = ((tree_ptr)darray_at(v->def->child, 0))->id; darray_ptr parm = ((tree_ptr)darray_at(v->def->child, 1))->child; int n = darray_count(parm); if (1 + n != darray_count(t->child)) { return val_new_error("%s: wrong number of arguments", name); } for (i = 0; i < n; i++) { const char *id = ((tree_ptr)darray_at(parm, i))->id; val_ptr v1 = tree_eval((tree_ptr)darray_at(t->child, i)); // TODO: Stack frames for recursion. symtab_put(tab, v1, id); } // Evaluate function body. darray_ptr a = ((tree_ptr)darray_at(v->def->child, 2))->child; darray_forall(a, eval_stmt); return NULL; }
void symtab_clear(symtab_t t) { darray_forall(t->list, clear); darray_clear(t->list); }