diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2024-11-26 07:41:10 -0500 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2024-11-26 07:41:10 -0500 |
commit | bc22ddab0d463209d6b6aae58be07c8a6df9e5d7 (patch) | |
tree | 7a0f2c90cae466bf620f5f9dec87d90d3ce9b647 | |
parent | 5cff8e25955dcc8e417e8be83a6746d2d42e7ff6 (diff) |
if else then
-rw-r--r-- | core.fth | 5 | ||||
-rw-r--r-- | forth.hpp | 14 |
2 files changed, 18 insertions, 1 deletions
@@ -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 + @@ -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; } |