From f194df81592ed1bafdca3593a8bbcf9f358d018d Mon Sep 17 00:00:00 2001 From: Simon Forman Date: Sun, 19 Feb 2023 17:43:18 -0800 Subject: [PATCH] How would you compile this? fn [+] step --- implementations/C/KEYWORDS.in | 1 + implementations/C/KEYWORDS.txt | 1 + implementations/C/joy.c | 33 ++++ implementations/C/joy.h | 1 + implementations/C/keywords.c | 272 ++++++++++++++++----------------- 5 files changed, 172 insertions(+), 136 deletions(-) diff --git a/implementations/C/KEYWORDS.in b/implementations/C/KEYWORDS.in index e3a6d3a..afd0065 100644 --- a/implementations/C/KEYWORDS.in +++ b/implementations/C/KEYWORDS.in @@ -43,3 +43,4 @@ rest, rest stack, stack swaack, swaack swap, swap +fn, fn diff --git a/implementations/C/KEYWORDS.txt b/implementations/C/KEYWORDS.txt index 2cc58bb..fb222a6 100644 --- a/implementations/C/KEYWORDS.txt +++ b/implementations/C/KEYWORDS.txt @@ -48,6 +48,7 @@ rest, rest stack, stack swaack, swaack swap, swap +fn, fn eq, def_eq gt, def_gt lt, def_lt diff --git a/implementations/C/joy.c b/implementations/C/joy.c index c0a5a85..f46fef7 100644 --- a/implementations/C/joy.c +++ b/implementations/C/joy.c @@ -279,6 +279,39 @@ push_thing_in_unit_list(JoyTypePtr term, JoyListPtr expression) } +/* +?- gronk("fn", `[+] step`). + + def fn(stack, expression, dictionary): + (s1, (i1, stack)) = stack + while s1: + (i2, s1) = s1 + i1 += i1 + i2 + return (i1, stack), expression, dictionary +*/ + +void +fn(JoyListPtr stack, __attribute__((unused)) JoyListPtr expression) +{ + JoyList s1 = pop_list(stack); + mpz_t *i1 = pop_int(stack); + JoyList node = newIntNode(); + mpz_set(node->head->value.i, *i1); + while (s1) { + if (joyInt == s1->head->kind) { + mpz_add(node->head->value.i, node->head->value.i, s1->head->value.i); + s1 = s1->tail; + } else { + fprintf(stderr, "Not an integer.\n"); + longjmp(jbuf, 1); + } + } + node->tail = *stack; + *stack = node; +} + + + /* ██████╗ ██████╗ ██╗███╗ ██╗████████╗███████╗██████╗ ██╔══██╗██╔══██╗██║████╗ ██║╚══██╔══╝██╔════╝██╔══██╗ diff --git a/implementations/C/joy.h b/implementations/C/joy.h index f80a74b..5acb65a 100644 --- a/implementations/C/joy.h +++ b/implementations/C/joy.h @@ -85,6 +85,7 @@ void sub(JoyListPtr stack, JoyListPtr expression); void fdiv_q(JoyListPtr stack, JoyListPtr expression); void fdiv_r(JoyListPtr stack, JoyListPtr expression); void truthy(JoyListPtr stack, JoyListPtr expression); +void fn(JoyListPtr stack, JoyListPtr expression); struct dict_entry { diff --git a/implementations/C/keywords.c b/implementations/C/keywords.c index 5eb71e4..d4625e5 100644 --- a/implementations/C/keywords.c +++ b/implementations/C/keywords.c @@ -59,7 +59,7 @@ keyword_hash (register const char *str, register size_t len) 10, 90, 0, 25, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 20, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, - 360, 360, 10, 360, 360, 90, 360, 100, 70, 0, + 360, 360, 30, 360, 360, 90, 360, 100, 70, 0, 5, 30, 40, 115, 15, 15, 360, 50, 40, 60, 0, 15, 0, 85, 70, 30, 25, 0, 95, 30, 30, 10, 20, 40, 360, 0, 360, 360, 360, 360, @@ -99,7 +99,7 @@ in_word_set (register const char *str, register size_t len) { enum { - TOTAL_KEYWORDS = 162, + TOTAL_KEYWORDS = 163, MIN_WORD_LENGTH = 1, MAX_WORD_LENGTH = 14, MIN_HASH_VALUE = 1, @@ -115,233 +115,234 @@ in_word_set (register const char *str, register size_t len) #line 41 "KEYWORDS.txt" {"dup", dup}, {""}, {""}, -#line 89 "KEYWORDS.txt" +#line 90 "KEYWORDS.txt" {"dupdip", def_dupdip}, #line 19 "KEYWORDS.txt" {"<>", def_neq}, {""}, -#line 87 "KEYWORDS.txt" - {"dupd", def_dupd}, #line 88 "KEYWORDS.txt" + {"dupd", def_dupd}, +#line 89 "KEYWORDS.txt" {"dupdd", def_dupdd}, {""}, -#line 90 "KEYWORDS.txt" +#line 91 "KEYWORDS.txt" {"dupdipd", def_dupdipd}, #line 46 "KEYWORDS.txt" {"pop", pop}, {""}, -#line 115 "KEYWORDS.txt" +#line 116 "KEYWORDS.txt" {"popop", def_popop}, #line 17 "KEYWORDS.txt" {"<", def_lt}, -#line 116 "KEYWORDS.txt" +#line 117 "KEYWORDS.txt" {"popopop", def_popopop}, #line 40 "KEYWORDS.txt" {"dip", dip}, -#line 113 "KEYWORDS.txt" - {"popd", def_popd}, #line 114 "KEYWORDS.txt" + {"popd", def_popd}, +#line 115 "KEYWORDS.txt" {"popdd", def_popdd}, -#line 117 "KEYWORDS.txt" - {"popopd", def_popopd}, #line 118 "KEYWORDS.txt" + {"popopd", def_popopd}, +#line 119 "KEYWORDS.txt" {"popopdd", def_popopdd}, {""}, -#line 82 "KEYWORDS.txt" +#line 83 "KEYWORDS.txt" {"dipd", def_dipd}, {""}, #line 43 "KEYWORDS.txt" {"i", i_joyfunc}, {""}, {""}, {""}, {""}, -#line 153 "KEYWORDS.txt" +#line 154 "KEYWORDS.txt" {"uncons", def_uncons}, -#line 75 "KEYWORDS.txt" +#line 76 "KEYWORDS.txt" {"ccccons", def_ccccons}, {""}, -#line 79 "KEYWORDS.txt" +#line 80 "KEYWORDS.txt" {"codi", def_codi}, {""}, #line 30 "KEYWORDS.txt" {"/", fdiv_q}, -#line 175 "KEYWORDS.txt" - {"/\\", def_SOLIDUS_REVERSE_SOLIDUS}, -#line 80 "KEYWORDS.txt" +#line 51 "KEYWORDS.txt" + {"fn", fn}, +#line 81 "KEYWORDS.txt" {"codireco", def_codireco}, -#line 154 "KEYWORDS.txt" +#line 155 "KEYWORDS.txt" {"unit", def_unit}, {""}, #line 39 "KEYWORDS.txt" {"concat", concat}, -#line 101 "KEYWORDS.txt" +#line 102 "KEYWORDS.txt" {"ii", def_ii}, {""}, #line 38 "KEYWORDS.txt" {"cons", cons}, -#line 76 "KEYWORDS.txt" +#line 77 "KEYWORDS.txt" {"ccons", def_ccons}, -#line 58 "KEYWORDS.txt" +#line 59 "KEYWORDS.txt" {"?", def_QUESTION_MARK}, -#line 176 "KEYWORDS.txt" - {"\\/", def_REVERSE_SOLIDUS_SOLIDUS}, -#line 63 "KEYWORDS.txt" + {""}, +#line 64 "KEYWORDS.txt" {"<{}", def_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET}, -#line 81 "KEYWORDS.txt" +#line 82 "KEYWORDS.txt" {"dinfrirst", def_dinfrirst}, -#line 99 "KEYWORDS.txt" +#line 100 "KEYWORDS.txt" {"hypot", def_hypot}, {""}, -#line 109 "KEYWORDS.txt" +#line 110 "KEYWORDS.txt" {"nullary", def_nullary}, {""}, -#line 78 "KEYWORDS.txt" +#line 79 "KEYWORDS.txt" {"clop", def_clop}, -#line 107 "KEYWORDS.txt" +#line 108 "KEYWORDS.txt" {"nulco", def_nulco}, -#line 159 "KEYWORDS.txt" +#line 160 "KEYWORDS.txt" {"x", def_x}, -#line 83 "KEYWORDS.txt" +#line 84 "KEYWORDS.txt" {"disenstacken", def_disenstacken}, #line 37 "KEYWORDS.txt" {"cmp", cmp_joyfunc}, -#line 64 "KEYWORDS.txt" +#line 65 "KEYWORDS.txt" {"<<{}", def_LESS_THAN_SIGN_LESS_THAN_SIGN_LEFT_CURLY_BRACKET_RIGHT_CURLY_BRACKET}, -#line 150 "KEYWORDS.txt" +#line 151 "KEYWORDS.txt" {"third", def_third}, {""}, -#line 157 "KEYWORDS.txt" +#line 158 "KEYWORDS.txt" {"unswons", def_unswons}, -#line 106 "KEYWORDS.txt" +#line 107 "KEYWORDS.txt" {"not", def_not}, -#line 91 "KEYWORDS.txt" +#line 92 "KEYWORDS.txt" {"enstacken", def_enstacken}, {""}, -#line 131 "KEYWORDS.txt" +#line 132 "KEYWORDS.txt" {"second", def_second}, - {""}, -#line 130 "KEYWORDS.txt" +#line 177 "KEYWORDS.txt" + {"\\/", def_REVERSE_SOLIDUS_SOLIDUS}, +#line 131 "KEYWORDS.txt" {"run", def_run}, #line 45 "KEYWORDS.txt" {"loop", loop}, -#line 133 "KEYWORDS.txt" +#line 134 "KEYWORDS.txt" {"shunt", def_shunt}, -#line 94 "KEYWORDS.txt" +#line 95 "KEYWORDS.txt" {"fourth", def_fourth}, -#line 85 "KEYWORDS.txt" +#line 86 "KEYWORDS.txt" {"down_to_zero", def_down_to_zero}, {""}, -#line 151 "KEYWORDS.txt" +#line 152 "KEYWORDS.txt" {"tuck", def_tuck}, {""}, -#line 136 "KEYWORDS.txt" +#line 137 "KEYWORDS.txt" {"spiral_next", def_spiral_next}, - {""}, +#line 176 "KEYWORDS.txt" + {"/\\", def_SOLIDUS_REVERSE_SOLIDUS}, #line 44 "KEYWORDS.txt" {"inscribe", inscribe}, -#line 108 "KEYWORDS.txt" +#line 109 "KEYWORDS.txt" {"null", def_null}, {""}, -#line 103 "KEYWORDS.txt" +#line 104 "KEYWORDS.txt" {"infrst", def_infrst}, -#line 156 "KEYWORDS.txt" +#line 157 "KEYWORDS.txt" {"unstack", def_unstack}, #line 23 "KEYWORDS.txt" {"mod", fdiv_r}, -#line 160 "KEYWORDS.txt" +#line 161 "KEYWORDS.txt" {"step", def_step}, -#line 132 "KEYWORDS.txt" +#line 133 "KEYWORDS.txt" {"shift", def_shift}, #line 28 "KEYWORDS.txt" {"-", sub}, -#line 53 "KEYWORDS.txt" +#line 54 "KEYWORDS.txt" {"lt", def_lt}, -#line 142 "KEYWORDS.txt" +#line 143 "KEYWORDS.txt" {"stuncons", def_stuncons}, -#line 86 "KEYWORDS.txt" +#line 87 "KEYWORDS.txt" {"drop", def_drop}, -#line 158 "KEYWORDS.txt" +#line 159 "KEYWORDS.txt" {"while", def_while}, {""}, -#line 110 "KEYWORDS.txt" +#line 111 "KEYWORDS.txt" {"of", def_of}, -#line 155 "KEYWORDS.txt" +#line 156 "KEYWORDS.txt" {"unquoted", def_unquoted}, -#line 134 "KEYWORDS.txt" +#line 135 "KEYWORDS.txt" {"size", def_size}, {""}, -#line 74 "KEYWORDS.txt" +#line 75 "KEYWORDS.txt" {"binary", def_binary}, -#line 55 "KEYWORDS.txt" +#line 56 "KEYWORDS.txt" {"le", def_le}, -#line 137 "KEYWORDS.txt" - {"split_at", def_split_at}, -#line 68 "KEYWORDS.txt" - {"app2", def_app2}, #line 138 "KEYWORDS.txt" + {"split_at", def_split_at}, +#line 69 "KEYWORDS.txt" + {"app2", def_app2}, +#line 139 "KEYWORDS.txt" {"split_list", def_split_list}, -#line 77 "KEYWORDS.txt" +#line 78 "KEYWORDS.txt" {"cleave", def_cleave}, -#line 146 "KEYWORDS.txt" +#line 147 "KEYWORDS.txt" {"swoncat", def_swoncat}, {""}, -#line 141 "KEYWORDS.txt" +#line 142 "KEYWORDS.txt" {"step_zero", def_step_zero}, -#line 145 "KEYWORDS.txt" +#line 146 "KEYWORDS.txt" {"swons", def_swons}, -#line 120 "KEYWORDS.txt" +#line 121 "KEYWORDS.txt" {"quoted", def_quoted}, {""}, -#line 59 "KEYWORDS.txt" +#line 60 "KEYWORDS.txt" {"and", def_and}, -#line 100 "KEYWORDS.txt" +#line 101 "KEYWORDS.txt" {"ifte", def_ifte}, -#line 152 "KEYWORDS.txt" +#line 153 "KEYWORDS.txt" {"unary", def_unary}, #line 32 "KEYWORDS.txt" {"lshift", lshift}, -#line 119 "KEYWORDS.txt" +#line 120 "KEYWORDS.txt" {"product", def_product}, #line 27 "KEYWORDS.txt" {"add", add}, -#line 123 "KEYWORDS.txt" +#line 124 "KEYWORDS.txt" {"reco", def_reco}, {""}, #line 24 "KEYWORDS.txt" {"*", mul}, -#line 112 "KEYWORDS.txt" +#line 113 "KEYWORDS.txt" {"pm", def_pm}, {""}, -#line 70 "KEYWORDS.txt" +#line 71 "KEYWORDS.txt" {"appN", def_appN}, {""}, -#line 84 "KEYWORDS.txt" +#line 85 "KEYWORDS.txt" {"divmod", def_divmod}, -#line 62 "KEYWORDS.txt" +#line 63 "KEYWORDS.txt" {"!-", def_EXCLAMATION_MARK_HYPHEN_MINUS}, -#line 95 "KEYWORDS.txt" +#line 96 "KEYWORDS.txt" {"gcd", def_gcd}, -#line 69 "KEYWORDS.txt" +#line 70 "KEYWORDS.txt" {"app3", def_app3}, -#line 125 "KEYWORDS.txt" +#line 126 "KEYWORDS.txt" {"roll>", def_roll_GREATER_THAN_SIGN}, -#line 127 "KEYWORDS.txt" +#line 128 "KEYWORDS.txt" {"rollup", def_rollup}, {""}, -#line 128 "KEYWORDS.txt" +#line 129 "KEYWORDS.txt" {"rolldown", def_rolldown}, {""}, -#line 164 "KEYWORDS.txt" +#line 165 "KEYWORDS.txt" {"times", def_times}, {""}, -#line 57 "KEYWORDS.txt" +#line 58 "KEYWORDS.txt" {"--", def_HYPHEN_MINUS_HYPHEN_MINUS}, {""}, -#line 67 "KEYWORDS.txt" +#line 68 "KEYWORDS.txt" {"app1", def_app1}, -#line 126 "KEYWORDS.txt" +#line 127 "KEYWORDS.txt" {"roll<", def_roll_LESS_THAN_SIGN}, -#line 73 "KEYWORDS.txt" +#line 74 "KEYWORDS.txt" {"b", def_b}, -#line 149 "KEYWORDS.txt" +#line 150 "KEYWORDS.txt" {"ternary", def_ternary}, #line 25 "KEYWORDS.txt" {"mul", mul}, @@ -351,55 +352,55 @@ in_word_set (register const char *str, register size_t len) {"clear", clear}, #line 33 "KEYWORDS.txt" {"rshift", rshift}, -#line 147 "KEYWORDS.txt" +#line 148 "KEYWORDS.txt" {"tailrec", def_tailrec}, {""}, {""}, {""}, -#line 96 "KEYWORDS.txt" +#line 97 "KEYWORDS.txt" {"genrec", def_genrec}, -#line 71 "KEYWORDS.txt" +#line 72 "KEYWORDS.txt" {"at", def_at}, -#line 143 "KEYWORDS.txt" +#line 144 "KEYWORDS.txt" {"sum", def_sum}, {""}, #line 42 "KEYWORDS.txt" {"first", first}, {""}, -#line 61 "KEYWORDS.txt" +#line 62 "KEYWORDS.txt" {"or", def_or}, {""}, #line 47 "KEYWORDS.txt" {"rest", rest}, -#line 102 "KEYWORDS.txt" +#line 103 "KEYWORDS.txt" {"infra", def_infra}, #line 26 "KEYWORDS.txt" {"+", add}, -#line 167 "KEYWORDS.txt" - {"_timest", def__timest}, #line 168 "KEYWORDS.txt" + {"_timest", def__timest}, +#line 169 "KEYWORDS.txt" {"map", def_map}, #line 50 "KEYWORDS.txt" {"swap", swap}, {""}, -#line 140 "KEYWORDS.txt" +#line 141 "KEYWORDS.txt" {"stackd", def_stackd}, -#line 52 "KEYWORDS.txt" +#line 53 "KEYWORDS.txt" {"gt", def_gt}, {""}, {""}, -#line 144 "KEYWORDS.txt" +#line 145 "KEYWORDS.txt" {"swapd", def_swapd}, #line 22 "KEYWORDS.txt" {"%", fdiv_r}, -#line 166 "KEYWORDS.txt" +#line 167 "KEYWORDS.txt" {"_times1", def__times1}, #line 29 "KEYWORDS.txt" {"sub", sub}, {""}, {""}, -#line 163 "KEYWORDS.txt" +#line 164 "KEYWORDS.txt" {"_stept", def__stept}, -#line 56 "KEYWORDS.txt" +#line 57 "KEYWORDS.txt" {"ge", def_ge}, {""}, -#line 93 "KEYWORDS.txt" +#line 94 "KEYWORDS.txt" {"fork", def_fork}, {""}, #line 15 "KEYWORDS.txt" @@ -407,102 +408,101 @@ in_word_set (register const char *str, register size_t len) #line 21 "KEYWORDS.txt" {">=", def_ge}, {""}, {""}, {""}, -#line 162 "KEYWORDS.txt" +#line 163 "KEYWORDS.txt" {"_step1", def__step1}, -#line 92 "KEYWORDS.txt" +#line 93 "KEYWORDS.txt" {"flatten", def_flatten}, {""}, {""}, {""}, {""}, #line 20 "KEYWORDS.txt" {"<=", def_le}, {""}, {""}, {""}, {""}, -#line 165 "KEYWORDS.txt" +#line 166 "KEYWORDS.txt" {"_times0", def__times0}, -#line 122 "KEYWORDS.txt" +#line 123 "KEYWORDS.txt" {"range_to_zero", def_range_to_zero}, {""}, -#line 129 "KEYWORDS.txt" +#line 130 "KEYWORDS.txt" {"rrest", def_rrest}, {""}, -#line 51 "KEYWORDS.txt" +#line 52 "KEYWORDS.txt" {"eq", def_eq}, -#line 54 "KEYWORDS.txt" +#line 55 "KEYWORDS.txt" {"neq", def_neq}, {""}, -#line 121 "KEYWORDS.txt" +#line 122 "KEYWORDS.txt" {"range", def_range}, {""}, {""}, {""}, -#line 148 "KEYWORDS.txt" +#line 149 "KEYWORDS.txt" {"take", def_take}, #line 48 "KEYWORDS.txt" {"stack", stack}, -#line 161 "KEYWORDS.txt" +#line 162 "KEYWORDS.txt" {"_step0", def__step0}, {""}, #line 31 "KEYWORDS.txt" {"div", fdiv_q}, -#line 174 "KEYWORDS.txt" - {"_\\/_", def___REVERSE_SOLIDUS_SOLIDUS__}, - {""}, + {""}, {""}, #line 49 "KEYWORDS.txt" {"swaack", swaack}, #line 18 "KEYWORDS.txt" {"!=", def_neq}, {""}, {""}, {""}, {""}, {""}, -#line 111 "KEYWORDS.txt" +#line 112 "KEYWORDS.txt" {"pam", def_pam}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, -#line 124 "KEYWORDS.txt" +#line 125 "KEYWORDS.txt" {"reverse", def_reverse}, -#line 65 "KEYWORDS.txt" +#line 66 "KEYWORDS.txt" {"abs", def_abs}, - {""}, -#line 135 "KEYWORDS.txt" +#line 175 "KEYWORDS.txt" + {"_\\/_", def___REVERSE_SOLIDUS_SOLIDUS__}, +#line 136 "KEYWORDS.txt" {"small", def_small}, {""}, {""}, {""}, {""}, {""}, {""}, -#line 60 "KEYWORDS.txt" +#line 61 "KEYWORDS.txt" {"++", def_PLUS_SIGN_PLUS_SIGN}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, -#line 173 "KEYWORDS.txt" +#line 174 "KEYWORDS.txt" {"_map2", def__map2}, {""}, {""}, -#line 139 "KEYWORDS.txt" +#line 140 "KEYWORDS.txt" {"sqr", def_sqr}, {""}, {""}, #line 35 "KEYWORDS.txt" {"branch", branch}, -#line 72 "KEYWORDS.txt" +#line 73 "KEYWORDS.txt" {"average", def_average}, -#line 105 "KEYWORDS.txt" +#line 106 "KEYWORDS.txt" {"neg", def_neg}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, -#line 66 "KEYWORDS.txt" +#line 67 "KEYWORDS.txt" {"anamorphism", def_anamorphism}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, -#line 169 "KEYWORDS.txt" +#line 170 "KEYWORDS.txt" {"_map?", def__map_QUESTION_MARK}, {""}, {""}, {""}, {""}, -#line 170 "KEYWORDS.txt" +#line 171 "KEYWORDS.txt" {"_mape", def__mape}, {""}, {""}, {""}, {""}, -#line 172 "KEYWORDS.txt" +#line 173 "KEYWORDS.txt" {"_map1", def__map1}, {""}, {""}, {""}, -#line 104 "KEYWORDS.txt" +#line 105 "KEYWORDS.txt" {"make_generator", def_make_generator}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, -#line 97 "KEYWORDS.txt" +#line 98 "KEYWORDS.txt" {"grabN", def_grabN}, {""}, {""}, {""}, {""}, -#line 171 "KEYWORDS.txt" +#line 172 "KEYWORDS.txt" {"_map0", def__map0}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, -#line 98 "KEYWORDS.txt" +#line 99 "KEYWORDS.txt" {"grba", def_grba} };