diff --git a/pila.c b/pila.c index 28c54d9..2e15262 100644 --- a/pila.c +++ b/pila.c @@ -441,6 +441,22 @@ parse_word_nat(RpnState *st) push_val(st, BOX_STR(wn)); } +void +find_word_nat(RpnState *st) +{ + Value wnw = pop_val(st); + if (wnw.kind == VAL_NIL || wnw.kind != VAL_STR) { + signal_error(st, "expected string"); + return; + } + Word *w = search_word(st, wnw.str); + if (w == nil) { + push_val(st, Nil); + return; + } + push_val(st, BOX_INTN((u64)w)); +} + void add_word(RpnState *st, Word *w) { @@ -635,6 +651,7 @@ main(int argc, char **argv) {.name = Sl("'"), .kind = WORD_NATIVE, .nat = tick_nat }, {.name = Sl(">#"), .kind = WORD_NATIVE, .nat = to_number_nat }, {.name = Sl("parse-word"), .kind = WORD_NATIVE, .nat = parse_word_nat }, + {.name = Sl("find-word"), .kind = WORD_NATIVE, .nat = find_word_nat }, {.name = Sl("exec"), .kind = WORD_NATIVE, .nat = exec_nat}, {.name = Sl("eval"), .kind = WORD_NATIVE, .nat = eval_nat}, {.name = Sl("dup"), .kind = WORD_NATIVE, .nat = dup_nat },