diff --git a/implementations/C/joy.c b/implementations/C/joy.c index 4e27885..61f3c6f 100644 --- a/implementations/C/joy.c +++ b/implementations/C/joy.c @@ -265,18 +265,10 @@ concat_lists(JoyList a, JoyList b) void push_thing_in_unit_list(JoyTypePtr term, JoyListPtr expression) { - JoyList x = EMPTY_LIST; - JoyListPtr xPtr = &x; - push_thing(term, xPtr); /* TODO: is this some weird error? - you get a pointer x on the stack, - set it to NULL (EMPTY_LIST), - then take x's address and put it in another pointer xPtr, - doens't that leave the tail of the JoyList node created in push_thing - pointing to the x pointer on the C stack in this function? - And doesn't that variable go away when we return? - How and why does this work? Is it an illusion, a bug waiting to bite? - */ - push_quote_onto_expression(*xPtr, expression); + JoyList node = newJoyList; + node->head = term; + node->tail = EMPTY_LIST; + push_quote_onto_expression(node, expression); } diff --git a/implementations/C/joy.h b/implementations/C/joy.h index de5c22f..c6a5fdb 100644 --- a/implementations/C/joy.h +++ b/implementations/C/joy.h @@ -21,11 +21,10 @@ along with Thun. If not see . enum JoyTypeType { - joySymbol, - joyTrue, - joyFalse, joyInt, - joyList + joyList, + joySymbol, + joyTrue, joyFalse }; typedef struct list_node* JoyList; @@ -55,21 +54,19 @@ typedef struct list_node { typedef void JoyFunc(JoyListPtr, JoyListPtr); - -JoyList text_to_expression(char *text); -void push_quote_onto_expression(JoyList el, JoyListPtr expression); -void init_defs(void); - - JoyFunc add, branch, clear, cmp_joyfunc, cons, concat, dip, dup, first, i_joyfunc, inscribe, loop, lshift, pop, rest, rshift, stack, swaack, swap, mul, sub, fdiv_q, fdiv_r, truthy, fn; -struct dict_entry { +struct dict_entry { char *name; JoyFunc *func; }; const struct dict_entry * in_word_set (register const char *str, register size_t len); + +JoyList text_to_expression(char *text); +void push_quote_onto_expression(JoyList el, JoyListPtr expression); +void init_defs(void);