aboutsummaryrefslogtreecommitdiff
path: root/src/doer.c
diff options
context:
space:
mode:
authorc2024-05-20 18:33:21 -0400
committerc2024-05-20 18:33:21 -0400
commita34cf81386868591117d95da85a2aacf5b8938bd (patch)
tree6b7e54f7396133f62dec32abbb1baf7dafe49267 /src/doer.c
parentfc7edb22079845ccd548e2034ff7193ca54f47ea (diff)
Broken.HEADmaster
Diffstat (limited to 'src/doer.c')
-rw-r--r--src/doer.c106
1 files changed, 62 insertions, 44 deletions
diff --git a/src/doer.c b/src/doer.c
index 6d38bd3..14d7d02 100644
--- a/src/doer.c
+++ b/src/doer.c
@@ -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) {