diff --git a/pila.c b/pila.c index 94ebca1..3b79acc 100644 --- a/pila.c +++ b/pila.c @@ -399,8 +399,6 @@ compile_end_nat(Pila *st) push_val(st, BOX_INTN((u64)st->cur_compw)); st->compiling = false; - st->cur_compw = nil; - st->cur_compw_cap = 0; } Str @@ -484,6 +482,16 @@ find_word_nat(Pila *st) 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 branch_nat(Pila *st) { @@ -694,7 +702,9 @@ main(int argc, char **argv) {.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("immediate"), .kind = WORD_NATIVE, .nat = immediate_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("dup"), .kind = WORD_NATIVE, .nat = dup_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("."), .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]); eval(&st, Sl(": ' parse-word find-word ;")); + /* isolate prelude state */ + st.cur_compw = nil; + st.cur_compw_cap = 0; if (argc > 1) { eval(&st, Str_from_c(argv[1]));