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]);