diff options
author | c | 2024-05-20 18:33:21 -0400 |
---|---|---|
committer | c | 2024-05-20 18:33:21 -0400 |
commit | a34cf81386868591117d95da85a2aacf5b8938bd (patch) | |
tree | 6b7e54f7396133f62dec32abbb1baf7dafe49267 /src/doer.c | |
parent | fc7edb22079845ccd548e2034ff7193ca54f47ea (diff) |
Diffstat (limited to 'src/doer.c')
-rw-r--r-- | src/doer.c | 106 |
1 files changed, 62 insertions, 44 deletions
@@ -351,66 +351,84 @@ void doer_do_call(doer_t* doer) { if (!resolved) { doer->tree = the_call; - target_def = doer_find_target_from_call(doer); // Is def. - - tree_t* darg = target_def->data.def.arg; - LOG_DBGF("------------------------------"); - tree_print(darg, 0); + resolved = doer_do_call_target(doer); + } + + target_print(doer->targets); + + tree_swp_call(the_call, resolved); + tree_destroy(the_call); + doer->tree = resolved; +} +tree_t* doer_do_call_target(doer_t* doer) { + tree_t* the_call = doer->tree; + tree_t* target_def = doer_find_target_from_call(doer); // Is def. - tree_t* carg = the_call->data.call.arg; + tree_t* resolution; - target_t - * targs = NULL, // Pointer to first target. - * targ = targs; // Pointer to where new targets will be added. + tree_t* darg = target_def->data.def.arg; + tree_t* carg = the_call->data.call.arg; - // Evaluate arguments. - while (darg) { - doer->tree = carg->data.carg.val; - // HACK: Assume already a primitive. - tree_t* carg_resolved = doer->tree; //doer_eval_prim(doer); + LOG_DBG("DARG:\n"); + tree_print(darg, 0); - char - * darg_type = darg->data.darg.tag->data.tag.val, - * carg_type = tree_type2str(carg_resolved->type); + LOG_DBG("CARG:\n"); + tree_print(carg, 0); - if (strcmp(darg_type, carg_type)) DIE("Type mismatch."); + target_t + * targs = NULL, // Pointer to first target. + * targ = targs; // Pointer to where new targets will be added. - targ = target_init( - "This field doesn't actually do anything but I can't be bothered to remove it :P", - carg_resolved - ); + // Evaluate arguments. + while (darg) { + doer->tree = carg->data.carg.val; + // HACK: Assume already a primitive. + tree_t* carg_resolved = doer->tree; //doer_eval_prim(doer); - targ = targ->nxt; - darg = darg->data.darg.nxt; + char + * darg_type = darg->data.darg.tag->data.tag.val, + * carg_type = tree_type2str(carg_resolved->type); - printf("\n\n[---\n"); - for (target_t* t = doer->targets; t; printf("%s\n", t->tree->data.def.tag->data.tag.nxt->data.tag.val) && (t = t->nxt)); - printf("---]\n"); - } + if (strcmp(darg_type, carg_type)) DIE("Type mismatch."); + + tree_t* carg_tree_def = tree_init(TREE_TYPE_DEF, NULL); + tree_t* carg_tree_def_arg1 = carg_tree_def->data.def.tag = tree_init(TREE_TYPE_TAG, carg_tree_def); // Type. + carg_tree_def_arg1->data.tag.val = darg_type; // Get type of the definition arg. + tree_t* carg_tree_def_arg2 = carg_tree_def_arg1->data.tag.nxt = tree_init(TREE_TYPE_TAG, carg_tree_def_arg1); // Name. + carg_tree_def_arg2->data.tag.val = darg->data.darg.tag->data.tag.nxt->data.tag.val; // Get the name of the definition arg. - target_t* old_ltarget = doer->ltarget; + targ = target_init( + "This field doesn't actually do anything but I can't be bothered to remove it :P", + carg_tree_def + ); - // Append the new targets from the args. - doer->ltarget->nxt = targs; - doer->ltarget = targ; + targ = targ->nxt; + darg = darg->data.darg.nxt; - // Execute the call. - doer->tree = target_def->data.def.val; - printf("[---\n"); + printf("\n\n[---\n"); for (target_t* t = doer->targets; t; printf("%s\n", t->tree->data.def.tag->data.tag.nxt->data.tag.val) && (t = t->nxt)); printf("---]\n"); - resolved = doer_eval_prim(doer); - - // Clean up temporary targets. - target_destroy(targs); - old_ltarget->nxt = NULL; - doer->ltarget = old_ltarget; } - tree_swp_call(the_call, resolved); - tree_destroy(the_call); - doer->tree = resolved; + target_t* old_ltarget = doer->ltarget; + + // Append the new targets from the args. + doer->ltarget->nxt = targs; + doer->ltarget = targ; + + // Execute the call. + doer->tree = target_def->data.def.val; + printf("[---\n"); + for (target_t* t = doer->targets; t; printf("%s\n", t->tree->data.def.tag->data.tag.nxt->data.tag.val) && (t = t->nxt)); + printf("---]\n"); + + // Clean up temporary targets. + target_destroy(targs); + old_ltarget->nxt = NULL; + doer->ltarget = old_ltarget; + + return doer_eval_prim(doer); } tree_t* doer_do_call_blin(doer_t* doer) { |