diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2024-11-27 20:53:16 -0500 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2024-11-27 20:53:16 -0500 |
commit | c4ec3bea1962ae16284a6a2fb9b91e7f7ed1e136 (patch) | |
tree | 1bffac612e96bfb53bc25995d9a7fd859097ae42 | |
parent | 221419aed946b3fa5665207a299fa4b826c67cc2 (diff) |
add postpone
-rw-r--r-- | forth.hpp | 13 |
1 files changed, 12 insertions, 1 deletions
@@ -300,6 +300,16 @@ struct forth if (fth.pop() == 0) fth.ip = *reinterpret_cast<func **>(ptr) - 1; }; + auto f_postpone = [](auto) { + assert<error::compile_only_word>(fth.compiling); + + auto w = fth.parse(); + auto g = fth.get(w); + + assert<error::word_not_found>(g.has_value()); + + *fth.here++ = reinterpret_cast<cell>((*g)->body()); + }; constexpr static word w_dict {"_d", f_dict}; constexpr static word w_add {"+", f_add, &w_dict}; @@ -333,8 +343,9 @@ struct forth constexpr static word w_cell {"cell", f_cell, &w_comm}; constexpr static word w_jmp {"_jmp", f_jmp, &w_cell}; constexpr static word w_jmp0 {"_jmp0", f_jmp0, &w_jmp}; + constexpr static word w_postp {"postpone", f_postpone, &w_jmp0, word_base::immediate}; - fth.latest = &w_jmp0; + fth.latest = &w_postp; fth.end = end_value; } |