diff --git a/implementations/C/KEYWORDS.in b/implementations/C/KEYWORDS.in index ad6717b..ebf1830 100644 --- a/implementations/C/KEYWORDS.in +++ b/implementations/C/KEYWORDS.in @@ -22,6 +22,7 @@ dip, dip dup, dup first, first i, i_joyfunc +loop, loop pop, pop rest, rest stack, stack diff --git a/implementations/C/KEYWORDS.txt b/implementations/C/KEYWORDS.txt index f9e3cba..5364bf5 100644 --- a/implementations/C/KEYWORDS.txt +++ b/implementations/C/KEYWORDS.txt @@ -27,6 +27,7 @@ dip, dip dup, dup first, first i, i_joyfunc +loop, loop pop, pop rest, rest stack, stack diff --git a/implementations/C/joy.c b/implementations/C/joy.c index c7f442a..efe5d05 100644 --- a/implementations/C/joy.c +++ b/implementations/C/joy.c @@ -45,6 +45,8 @@ const char *TRUE = "true"; JoyTypePtr JoyTrue; JoyTypePtr JoyFalse; +JoyType loop_symbol = {joySymbol, {"loop"}}; + void* reallocate_function (void *ptr, __attribute__((unused)) size_t old_size, size_t new_size) { @@ -252,7 +254,8 @@ newIntNode(void) { void -push_thing(JoyTypePtr term, JoyListPtr stack) { +push_thing(JoyTypePtr term, JoyListPtr stack) +{ JoyList node = newJoyList; node->head = term; node->tail = *stack; @@ -272,6 +275,16 @@ 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); + push_quote_onto_expression(*xPtr, expression); +} + + /* ██████╗ ██████╗ ██╗███╗ ██╗████████╗███████╗██████╗ ██╔══██╗██╔══██╗██║████╗ ██║╚══██╔══╝██╔════╝██╔══██╗ @@ -588,6 +601,22 @@ branch(JoyListPtr stack, JoyListPtr expression) } +void +loop(JoyListPtr stack, JoyListPtr expression) +{ + JoyList body = pop_list_node(stack); + JoyList x = EMPTY_LIST; + + if (pop_bool(stack)) { + JoyListPtr xPtr = &x; + push_thing(&loop_symbol, xPtr); + push_quote(body, xPtr); + push_quote_onto_expression(*xPtr, expression); + push_quote_onto_expression(body, expression); + } +} + + void clear(JoyListPtr stack, __attribute__((unused)) JoyListPtr expression) { @@ -678,10 +707,7 @@ dip(JoyListPtr stack, JoyListPtr expression) { JoyList quote = pop_list_node(stack); JoyList node = pop_any(stack); - JoyList x = EMPTY_LIST; - JoyListPtr xPtr = &x; - push_thing(node->head, xPtr); - push_quote_onto_expression(*xPtr, expression); + push_thing_in_unit_list(node->head, expression); push_quote_onto_expression(quote, expression); } diff --git a/implementations/C/joy.h b/implementations/C/joy.h index e905364..2e7ff1f 100644 --- a/implementations/C/joy.h +++ b/implementations/C/joy.h @@ -34,9 +34,9 @@ typedef JoyList* JoyListPtr; typedef struct { enum JoyTypeType kind; union { + char *symbol; mpz_t i; JoyList el; - char *symbol; } value; } JoyType; @@ -71,6 +71,7 @@ void dip(JoyListPtr stack, JoyListPtr expression); void dup(JoyListPtr stack, JoyListPtr expression); void first(JoyListPtr stack, JoyListPtr expression); void i_joyfunc(JoyListPtr stack, JoyListPtr expression); +void loop(JoyListPtr stack, JoyListPtr expression); void pop(JoyListPtr stack, JoyListPtr expression); void rest(JoyListPtr stack, JoyListPtr expression); void stack(JoyListPtr stack, JoyListPtr expression); diff --git a/implementations/C/keywords.c b/implementations/C/keywords.c index 5db1532..8747df6 100644 --- a/implementations/C/keywords.c +++ b/implementations/C/keywords.c @@ -36,7 +36,7 @@ #line 13 "KEYWORDS.txt" struct dict_entry; #include -/* maximum key range = 61, duplicates = 0 */ +/* maximum key range = 64, duplicates = 0 */ #ifdef __GNUC__ __inline @@ -50,32 +50,32 @@ keyword_hash (register const char *str, register size_t len) { static const unsigned char asso_values[] = { - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 60, 62, 62, - 62, 62, 55, 50, 62, 45, 62, 0, 62, 45, - 40, 35, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 30, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 0, 25, 15, - 20, 0, 62, 62, 35, 10, 62, 5, 25, 5, - 0, 0, 10, 62, 0, 5, 0, 15, 0, 10, - 62, 20, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62 + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 60, 65, 65, + 65, 65, 55, 50, 65, 45, 65, 35, 65, 40, + 35, 25, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 20, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 20, 0, 0, + 25, 5, 65, 65, 25, 10, 65, 15, 30, 5, + 0, 0, 20, 65, 0, 0, 0, 15, 0, 5, + 65, 5, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65 }; register unsigned int hval = len; @@ -95,113 +95,116 @@ in_word_set (register const char *str, register size_t len) { enum { - TOTAL_KEYWORDS = 41, + TOTAL_KEYWORDS = 42, MIN_WORD_LENGTH = 1, MAX_WORD_LENGTH = 12, MIN_HASH_VALUE = 1, - MAX_HASH_VALUE = 61 + MAX_HASH_VALUE = 64 }; static const struct dict_entry wordlist[] = { {""}, -#line 19 "KEYWORDS.txt" - {"/", tdiv_q}, -#line 41 "KEYWORDS.txt" - {"at", def_at}, - {""}, -#line 31 "KEYWORDS.txt" - {"rest", rest}, -#line 55 "KEYWORDS.txt" - {"infra", def_infra}, -#line 25 "KEYWORDS.txt" - {"concat", concat}, +#line 44 "KEYWORDS.txt" + {"b", def_b}, #line 42 "KEYWORDS.txt" - {"average", def_average}, -#line 50 "KEYWORDS.txt" - {"codireco", def_codireco}, + {"at", def_at}, +#line 36 "KEYWORDS.txt" + {"abs", def_abs}, #line 24 "KEYWORDS.txt" {"cons", cons}, +#line 47 "KEYWORDS.txt" + {"ccons", def_ccons}, +#line 25 "KEYWORDS.txt" + {"concat", concat}, +#line 46 "KEYWORDS.txt" + {"ccccons", def_ccccons}, +#line 51 "KEYWORDS.txt" + {"codireco", def_codireco}, #line 32 "KEYWORDS.txt" - {"stack", stack}, + {"rest", rest}, +#line 55 "KEYWORDS.txt" + {"swons", def_swons}, #line 29 "KEYWORDS.txt" {"i", i_joyfunc}, +#line 43 "KEYWORDS.txt" + {"average", def_average}, {""}, -#line 30 "KEYWORDS.txt" - {"pop", pop}, -#line 49 "KEYWORDS.txt" +#line 50 "KEYWORDS.txt" {"codi", def_codi}, #line 28 "KEYWORDS.txt" {"first", first}, -#line 36 "KEYWORDS.txt" +#line 37 "KEYWORDS.txt" {"anamorphism", def_anamorphism}, + {""}, {""}, +#line 52 "KEYWORDS.txt" + {"dinfrirst", def_dinfrirst}, +#line 33 "KEYWORDS.txt" + {"stack", stack}, +#line 45 "KEYWORDS.txt" + {"binary", def_binary}, +#line 54 "KEYWORDS.txt" + {"disenstacken", def_disenstacken}, +#line 31 "KEYWORDS.txt" + {"pop", pop}, +#line 30 "KEYWORDS.txt" + {"loop", loop}, +#line 56 "KEYWORDS.txt" + {"infra", def_infra}, +#line 34 "KEYWORDS.txt" + {"swaack", swaack}, {""}, #line 23 "KEYWORDS.txt" {"cmp", cmp_joyfunc}, -#line 51 "KEYWORDS.txt" - {"dinfrirst", def_dinfrirst}, -#line 54 "KEYWORDS.txt" - {"swons", def_swons}, -#line 33 "KEYWORDS.txt" - {"swaack", swaack}, -#line 53 "KEYWORDS.txt" - {"disenstacken", def_disenstacken}, +#line 35 "KEYWORDS.txt" + {"swap", swap}, + {""}, +#line 21 "KEYWORDS.txt" + {"branch", branch}, + {""}, #line 26 "KEYWORDS.txt" {"dip", dip}, -#line 34 "KEYWORDS.txt" - {"swap", swap}, -#line 46 "KEYWORDS.txt" - {"ccons", def_ccons}, -#line 43 "KEYWORDS.txt" - {"b", def_b}, -#line 45 "KEYWORDS.txt" - {"ccccons", def_ccccons}, -#line 27 "KEYWORDS.txt" - {"dup", dup}, #line 20 "KEYWORDS.txt" {"bool", truthy}, #line 22 "KEYWORDS.txt" {"clear", clear}, -#line 47 "KEYWORDS.txt" - {"cleave", def_cleave}, +#line 19 "KEYWORDS.txt" + {"/", tdiv_q}, {""}, -#line 35 "KEYWORDS.txt" - {"abs", def_abs}, -#line 52 "KEYWORDS.txt" +#line 27 "KEYWORDS.txt" + {"dup", dup}, +#line 53 "KEYWORDS.txt" {"dipd", def_dipd}, {""}, -#line 44 "KEYWORDS.txt" - {"binary", def_binary}, - {""}, {""}, #line 48 "KEYWORDS.txt" - {"clop", def_clop}, - {""}, -#line 21 "KEYWORDS.txt" - {"branch", branch}, + {"cleave", def_cleave}, {""}, {""}, -#line 40 "KEYWORDS.txt" +#line 41 "KEYWORDS.txt" {"appN", def_appN}, {""}, #line 18 "KEYWORDS.txt" {"-", sub}, {""}, {""}, -#line 39 "KEYWORDS.txt" +#line 40 "KEYWORDS.txt" {"app3", def_app3}, {""}, #line 17 "KEYWORDS.txt" {"+", add}, {""}, {""}, -#line 38 "KEYWORDS.txt" - {"app2", def_app2}, +#line 49 "KEYWORDS.txt" + {"clop", def_clop}, {""}, #line 16 "KEYWORDS.txt" {"*", mul}, {""}, {""}, -#line 37 "KEYWORDS.txt" - {"app1", def_app1}, +#line 39 "KEYWORDS.txt" + {"app2", def_app2}, {""}, #line 15 "KEYWORDS.txt" - {"%", tdiv_r} + {"%", tdiv_r}, + {""}, {""}, +#line 38 "KEYWORDS.txt" + {"app1", def_app1} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)