diff --git a/pila.c b/pila.c index 409112c..28c54d9 100644 --- a/pila.c +++ b/pila.c @@ -174,21 +174,22 @@ push_val(RpnState *st, Value val) st->data_stack[st->sp++] = val; } -Value -top_val(RpnState *st) +bool +top_val(RpnState *st, Value *val) { if (st->sp == 0) { signal_error(st, "stack underflow"); - return Nil; + return false; } - return st->data_stack[st->sp - 1]; + *val = st->data_stack[st->sp - 1]; + return true; } Value pop_val(RpnState *st) { - Value val = top_val(st); - if (val.kind == VAL_NIL) + Value val; + if (!top_val(st, &val)) return Nil; --st->sp; return val; @@ -256,7 +257,9 @@ not_nat(RpnState *st) void dup_nat(RpnState *st) { - push_val(st, top_val(st)); + Value val; + top_val(st, &val); + push_val(st, val); } void @@ -430,6 +433,14 @@ to_number_nat(RpnState *st) push_val(st, BOX_INTN(n)); } +void +parse_word_nat(RpnState *st) +{ + skip_whitespace(&st->rsp, st->rep); + Str wn = read_word_name(&st->rsp, st->rep); + push_val(st, BOX_STR(wn)); +} + void add_word(RpnState *st, Word *w) { @@ -623,6 +634,7 @@ main(int argc, char **argv) {.name = Sl(";"), .kind = WORD_NATIVE, .nat = compile_end_nat }, {.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("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 },