aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2024-11-27 20:53:16 -0500
committerClyne Sullivan <clyne@bitgloo.com>2024-11-27 20:53:16 -0500
commitc4ec3bea1962ae16284a6a2fb9b91e7f7ed1e136 (patch)
tree1bffac612e96bfb53bc25995d9a7fd859097ae42
parent221419aed946b3fa5665207a299fa4b826c67cc2 (diff)
add postpone
-rw-r--r--forth.hpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/forth.hpp b/forth.hpp
index cc6c679..af6ecc9 100644
--- a/forth.hpp
+++ b/forth.hpp
@@ -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;
}