From c3e786aed9ad7d777bec74ee6f435b6108feb284 Mon Sep 17 00:00:00 2001 From: Simon Forman Date: Sat, 4 Feb 2023 19:19:48 -0800 Subject: [PATCH] branch combinator. --- implementations/C/joy.c | 39 +++++++++++++++++++++++++++++---------- implementations/C/notes | 1 - 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/implementations/C/joy.c b/implementations/C/joy.c index 3f0bd89..b0450b3 100644 --- a/implementations/C/joy.c +++ b/implementations/C/joy.c @@ -164,8 +164,7 @@ pop_any(JoyListPtr stack) mpz_t * pop_int(JoyListPtr stack) { - JoyList node; - node = pop_any(stack); + JoyList node = pop_any(stack); switch (node->head->kind) { case joyInt: return &(node->head->value.i); @@ -176,6 +175,23 @@ pop_int(JoyListPtr stack) } +int +pop_bool(JoyListPtr stack) +{ + JoyList node = pop_any(stack); + /* TODO: Look for just the singletons? */ + switch (node->head->kind) { + case joyTrue: + return 1; + case joyFalse: + return 0; + default: + printf("Not a Boolean.\n"); + exit(1); + } +} + + JoyList pop_list(JoyListPtr stack) { @@ -536,13 +552,7 @@ cmp_joyfunc(JoyListPtr stack, JoyListPtr expression) b = pop_int(stack); a = pop_int(stack); hmm = mpz_cmp(*a, *b); - if (hmm > 0) { - push_quote(G, expression); - } else if (hmm < 0) { - push_quote(L, expression); - } else { - push_quote(E, expression); - } + push_quote(((hmm > 0) ? G : (hmm < 0) ? L : E), expression); } @@ -553,7 +563,16 @@ i_joyfunc(JoyListPtr stack, JoyListPtr expression) } -void branch(JoyListPtr stack, JoyListPtr expression) {stack = expression;} +void +branch(JoyListPtr stack, JoyListPtr expression) +{ + JoyList T, F; + T = pop_list_node(stack); + F = pop_list_node(stack); + push_quote((pop_bool(stack) ? T : F), expression); +} + + void clear(JoyListPtr stack, JoyListPtr expression) {stack = expression;} void div_joyfunc(JoyListPtr stack, JoyListPtr expression) {stack = expression;} void mod(JoyListPtr stack, JoyListPtr expression) {stack = expression;} diff --git a/implementations/C/notes b/implementations/C/notes index 36646a6..9795ced 100644 --- a/implementations/C/notes +++ b/implementations/C/notes @@ -15,7 +15,6 @@ cons dip dup first -i loop pop rest