From 7028ee43696e9fbec2929ce8a2f74c16a5778716 Mon Sep 17 00:00:00 2001 From: tocariimaa Date: Wed, 5 Feb 2025 14:37:15 -0300 Subject: [PATCH] word flags, add immediate flag and remove special case for `;` --- pila.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pila.c b/pila.c index c3ddd22..4f76ed6 100644 --- a/pila.c +++ b/pila.c @@ -12,6 +12,7 @@ #define BOX_STR(n) (Value){.kind = VAL_STR, .str = n} #define PILA_TRUE ((u64)1) #define PILA_FALSE ((u64)0) +#define WRDF_IMMEDIATE (1 << 2) typedef struct UserWord UserWord; typedef struct Word Word; @@ -50,6 +51,7 @@ struct UserWord { struct Word { Str name; + u8 flags; WordKind kind; union { NativeWord nat; @@ -644,8 +646,8 @@ eval(RpnState *st, Str src) if (!st->compiling) eval_word(st, w); else { - if (w->kind == WORD_NATIVE && w->nat == compile_end_nat) { - w->nat(st); + if (w->flags & WRDF_IMMEDIATE) { + eval_word(st, w); } else { st->cur_compw->uword.words[st->cur_compw->uword.len++] = w; } @@ -689,7 +691,9 @@ main(int argc, char **argv) {.name = Sl("!"), .kind = WORD_NATIVE, .nat = not_nat }, {.name = Sl(":"), .kind = WORD_NATIVE, .nat = compile_start_nat }, {.name = Sl(":?"), .kind = WORD_NATIVE, .nat = compile_anon_start_nat }, - {.name = Sl(";"), .kind = WORD_NATIVE, .nat = compile_end_nat }, + { .name = Sl(";"), .flags = WRDF_IMMEDIATE, + .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 },