add immediate nat word

This commit is contained in:
tocariimaa 2025-02-05 19:40:37 -03:00
parent bc9bc44e5d
commit 657164429f

18
pila.c
View file

@ -399,8 +399,6 @@ compile_end_nat(Pila *st)
push_val(st, BOX_INTN((u64)st->cur_compw)); push_val(st, BOX_INTN((u64)st->cur_compw));
st->compiling = false; st->compiling = false;
st->cur_compw = nil;
st->cur_compw_cap = 0;
} }
Str Str
@ -484,6 +482,16 @@ find_word_nat(Pila *st)
push_val(st, BOX_INTN((u64)w)); push_val(st, BOX_INTN((u64)w));
} }
void
immediate_nat(Pila *st)
{
if (st->cur_compw == nil) {
signal_error(st, "no word to mark as immediate");
return;
}
st->cur_compw->flags |= WRDF_IMMEDIATE;
}
void void
branch_nat(Pila *st) branch_nat(Pila *st)
{ {
@ -694,7 +702,9 @@ main(int argc, char **argv)
{.name = Sl(">#"), .kind = WORD_NATIVE, .nat = to_number_nat }, {.name = Sl(">#"), .kind = WORD_NATIVE, .nat = to_number_nat },
{.name = Sl("parse-word"), .kind = WORD_NATIVE, .nat = parse_word_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("find-word"), .kind = WORD_NATIVE, .nat = find_word_nat },
{.name = Sl("immediate"), .kind = WORD_NATIVE, .nat = immediate_nat },
{.name = Sl("call"), .kind = WORD_NATIVE, .nat = call_nat}, {.name = Sl("call"), .kind = WORD_NATIVE, .nat = call_nat},
{.name = Sl("branch"), .kind = WORD_NATIVE, .nat = branch_nat },
{.name = Sl("eval"), .kind = WORD_NATIVE, .nat = eval_nat}, {.name = Sl("eval"), .kind = WORD_NATIVE, .nat = eval_nat},
{.name = Sl("dup"), .kind = WORD_NATIVE, .nat = dup_nat }, {.name = Sl("dup"), .kind = WORD_NATIVE, .nat = dup_nat },
{.name = Sl("drop"), .kind = WORD_NATIVE, .nat = drop_nat }, {.name = Sl("drop"), .kind = WORD_NATIVE, .nat = drop_nat },
@ -704,12 +714,14 @@ main(int argc, char **argv)
{.name = Sl("emit"), .kind = WORD_NATIVE, .nat = emit_nat }, {.name = Sl("emit"), .kind = WORD_NATIVE, .nat = emit_nat },
{.name = Sl("."), .kind = WORD_NATIVE, .nat = print_nat }, {.name = Sl("."), .kind = WORD_NATIVE, .nat = print_nat },
{.name = Sl(","), .kind = WORD_NATIVE, .nat = getch_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) for (isize i = 0; i < countof(natws); ++i)
add_word(&st, &natws[i]); add_word(&st, &natws[i]);
eval(&st, Sl(": ' parse-word find-word ;")); eval(&st, Sl(": ' parse-word find-word ;"));
/* isolate prelude state */
st.cur_compw = nil;
st.cur_compw_cap = 0;
if (argc > 1) { if (argc > 1) {
eval(&st, Str_from_c(argv[1])); eval(&st, Str_from_c(argv[1]));