aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2024-11-26 07:41:10 -0500
committerClyne Sullivan <clyne@bitgloo.com>2024-11-26 07:41:10 -0500
commitbc22ddab0d463209d6b6aae58be07c8a6df9e5d7 (patch)
tree7a0f2c90cae466bf620f5f9dec87d90d3ce9b647
parent5cff8e25955dcc8e417e8be83a6746d2d42e7ff6 (diff)
if else then
-rw-r--r--core.fth5
-rw-r--r--forth.hpp14
2 files changed, 18 insertions, 1 deletions
diff --git a/core.fth b/core.fth
index 3f850b1..1a6f1dd 100644
--- a/core.fth
+++ b/core.fth
@@ -34,7 +34,12 @@
: +! dup >r swap r> @ + swap ! ;
: allot dp +! ;
: , here ! cell allot ;
+: ['] ' [ ' literal , ] ; immediate
: 1+ 1 + ;
: 1- 1 - ;
+: if ['] _jmp0 , here 0 , ; immediate
+: then here swap ! ; immediate
+: else ['] _jmp , here 0 , swap here swap ! ; immediate
+
diff --git a/forth.hpp b/forth.hpp
index 3873c68..a9c55df 100644
--- a/forth.hpp
+++ b/forth.hpp
@@ -282,6 +282,16 @@ struct forth
auto f_semic = [](auto) { *fth.here++ = 0; fth.compiling = false; };
auto f_comm = [](auto) { fth.sourcei = npos; };
auto f_cell = [](auto) { fth.push(sizeof(cell)); };
+ auto f_jmp = [](auto) {
+ auto ptr = ++fth.ip;
+ fth.ip = *reinterpret_cast<func **>(ptr) - 1;
+ };
+ auto f_jmp0 = [](auto) {
+ auto ptr = ++fth.ip;
+
+ if (fth.pop() == 0)
+ fth.ip = *reinterpret_cast<func **>(ptr) - 1;
+ };
constexpr static word w_dict {"_d", f_dict};
constexpr static word w_add {"+", f_add, &w_dict};
@@ -308,8 +318,10 @@ struct forth
constexpr static word w_semic {";", f_semic, &w_colon, word_base::immediate};
constexpr static word w_comm {"\\", f_comm, &w_semic, word_base::immediate};
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};
- fth.latest = &w_cell;
+ fth.latest = &w_jmp0;
fth.end = end_value;
}