From 96709aa013e873cf5dba5dd3c2afb54a8d391eb0 Mon Sep 17 00:00:00 2001 From: tocariimaa Date: Wed, 5 Feb 2025 13:33:29 -0300 Subject: [PATCH] add `branch` word --- pila.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pila.c b/pila.c index 2a5a862..78d5d82 100644 --- a/pila.c +++ b/pila.c @@ -477,6 +477,24 @@ find_word_nat(RpnState *st) push_val(st, BOX_INTN((u64)w)); } +void +branch_nat(RpnState *st) +{ + Value predw = pop_val(st); + if (predw.kind != VAL_INT) { + return; + } + Str wn = next_word(st); + if (predw.intn == PILA_TRUE) { + Word *w = search_word(st, wn); + if (w == nil) { + signal_errorf(st, "no such word '%.*s'", (int)wn.len, wn.s); + return; + } + eval_word(st, w); + } +} + void add_word(RpnState *st, Word *w) { @@ -682,6 +700,7 @@ main(int argc, char **argv) {.name = Sl("emit"), .kind = WORD_NATIVE, .nat = emit_nat }, {.name = Sl("."), .kind = WORD_NATIVE, .nat = print_nat }, {.name = Sl(","), .kind = WORD_NATIVE, .nat = getch_nat }, + {.name = Sl("branch"), .kind = WORD_NATIVE, .nat = branch_nat }, }; for (isize i = 0; i < countof(natws); ++i) add_word(&st, &natws[i]);