diff options
Diffstat (limited to 'sprit.cpp')
-rw-r--r-- | sprit.cpp | 92 |
1 files changed, 46 insertions, 46 deletions
@@ -33,59 +33,59 @@ static void discard() { auto v = pop(); (void)v; } static void tobool() { if (*sp()) *sp() = -1; } constinit WordSet words ( - Word("[", WordWrap<[] { STATE = 0; }>()).markImmediate(), - Word("]", WordWrap<[] { STATE = -1; }>()), - Word("@", WordWrap<peek>()), - Word("c@", WordWrap<peek, [] { *sp() &= 0xFF; }>()), - Word("!", WordWrap<[] { auto a = (Cell *)pop(); *a = pop(); }>()), - Word("c!", WordWrap<[] { auto a = (char *)pop(); *a = pop(); }>()), - Word("_d", WordWrap<[] { *sp() += (Cell)DICT.data(); }>()), - Word("_jmp", WordWrap<[] { jump((FuncList)*++IP); }>()), + Word("[", WordWrap<[] { STATE = 0; }>).markImmediate(), + Word("]", WordWrap<[] { STATE = -1; }>), + Word("@", WordWrap<peek>), + Word("c@", WordWrap<peek, [] { *sp() &= 0xFF; }>), + Word("!", WordWrap<[] { auto a = (Cell *)pop(); *a = pop(); }>), + Word("c!", WordWrap<[] { auto a = (char *)pop(); *a = pop(); }>), + Word("_d", WordWrap<[] { *sp() += (Cell)DICT.data(); }>), + Word("_jmp", WordWrap<[] { jump((FuncList)*++IP); }>), Word("_jmp0", WordWrap<[] { ++IP; if (pop() == 0) jump((FuncList)*IP); - }>()), - Word(",", WordWrap<commaSP>()), - Word("emit", WordWrap<[] { std::putchar(pop()); }>()), - Word("key", WordWrap<[] { push(key()); }>()), - Word("key?", WordWrap<[] { push(haskey()); }, tobool>()), - Word("execute", WordWrap<[] { (void)executor((FuncList *)pop()); }>()), - Word(":", WordWrap<colon>()), - Word(";", WordWrap<semic>()).markImmediate(), + }>), + Word(",", WordWrap<commaSP>), + Word("emit", WordWrap<[] { std::putchar(pop()); }>), + Word("key", WordWrap<[] { push(key()); }>), + Word("key?", WordWrap<[] { push(haskey()); }, tobool>), + Word("execute", WordWrap<[] { (void)executor((FuncList *)pop()); }>), + Word(":", WordWrap<colon>), + Word(";", WordWrap<semic>).markImmediate(), Word("exit", fexit), - Word("drop", WordWrap<discard>()), - Word("dup", WordWrap<[] { push(*sp()); }>()), - Word("swap", WordWrap<[] { std::swap(*sp(), *(sp() - 1)); }>()), - Word("pick", WordWrap<[] { auto t = *(sp() - *sp() - 1); *sp() = t; }>()), - Word("cells", WordWrap<[] { *sp() *= sizeof(Cell); }>()), - Word("+", WordWrap<[] { *(sp() - 1) += *sp(); }, discard>()), - Word("-", WordWrap<[] { *(sp() - 1) -= *sp(); }, discard>()), - Word("*", WordWrap<[] { *(sp() - 1) *= *sp(); }, discard>()), - Word("/", WordWrap<[] { *(sp() - 1) /= *sp(); }, discard>()), - Word("mod", WordWrap<[] { *(sp() - 1) %= *sp(); }, discard>()), - Word("=", WordWrap<[] { *(sp() - 1) = *(sp() - 1) == *sp(); }, discard, tobool>()), - Word("<", WordWrap<[] { *(sp() - 1) = *(sp() - 1) < *sp(); }, discard, tobool>()), - Word("or", WordWrap<[] { *(sp() - 1) |= *sp(); }, discard>()), - Word("and", WordWrap<[] { *(sp() - 1) &= *sp(); }, discard>()), - Word("xor", WordWrap<[] { *(sp() - 1) ^= *sp(); }, discard>()), - Word("lshift", WordWrap<[] { *(sp() - 1) <<= *sp(); }, discard>()), - Word("rshift", WordWrap<[] { *(sp() - 1) >>= *sp(); }, discard>()), - Word(">r", WordWrap<[] { rpush(pop()); }>()), - Word("r>", WordWrap<[] { push(rpop()); }>()), - Word("immediate", WordWrap<[] { ((Word *)LATEST)->markImmediate(); }>()), - Word("aligned", WordWrap<[] { *sp() = aligned(*sp()); }>()), - Word("align", WordWrap<align>()), - Word("literal", WordWrap<[] { if (STATE) compileliteral(); }>()).markImmediate(), - Word("\'", WordWrap<tick>()), - Word("_i", WordWrap<[] { *sp() = ((Word *)*sp())->immediate(); }, tobool>()), - Word("[']", WordWrap<tick, compileliteral>()).markImmediate(), - Word("compile,", WordWrap<peek, commaSP>()), - Word("word", WordWrap<word>()), + Word("drop", WordWrap<discard>), + Word("dup", WordWrap<[] { push(*sp()); }>), + Word("swap", WordWrap<[] { std::swap(*sp(), *(sp() - 1)); }>), + Word("pick", WordWrap<[] { auto t = *(sp() - *sp() - 1); *sp() = t; }>), + Word("cells", WordWrap<[] { *sp() *= sizeof(Cell); }>), + Word("+", WordWrap<[] { *(sp() - 1) += *sp(); }, discard>), + Word("-", WordWrap<[] { *(sp() - 1) -= *sp(); }, discard>), + Word("*", WordWrap<[] { *(sp() - 1) *= *sp(); }, discard>), + Word("/", WordWrap<[] { *(sp() - 1) /= *sp(); }, discard>), + Word("mod", WordWrap<[] { *(sp() - 1) %= *sp(); }, discard>), + Word("=", WordWrap<[] { *(sp() - 1) = *(sp() - 1) == *sp(); }, discard, tobool>), + Word("<", WordWrap<[] { *(sp() - 1) = *(sp() - 1) < *sp(); }, discard, tobool>), + Word("or", WordWrap<[] { *(sp() - 1) |= *sp(); }, discard>), + Word("and", WordWrap<[] { *(sp() - 1) &= *sp(); }, discard>), + Word("xor", WordWrap<[] { *(sp() - 1) ^= *sp(); }, discard>), + Word("lshift", WordWrap<[] { *(sp() - 1) <<= *sp(); }, discard>), + Word("rshift", WordWrap<[] { *(sp() - 1) >>= *sp(); }, discard>), + Word(">r", WordWrap<[] { rpush(pop()); }>), + Word("r>", WordWrap<[] { push(rpop()); }>), + Word("immediate", WordWrap<[] { ((Word *)LATEST)->markImmediate(); }>), + Word("aligned", WordWrap<[] { *sp() = aligned(*sp()); }>), + Word("align", WordWrap<align>), + Word("literal", WordWrap<[] { if (STATE) compileliteral(); }>).markImmediate(), + Word("\'", WordWrap<tick>), + Word("_i", WordWrap<[] { *sp() = ((Word *)*sp())->immediate(); }, tobool>), + Word("[']", WordWrap<tick, compileliteral>).markImmediate(), + Word("compile,", WordWrap<peek, commaSP>), + Word("word", WordWrap<word>), Word("_b", WordWrap<[] { std::putchar('#'); // Gives a good breakpoint spot for gdb - }>()), - Word(".", WordWrap<[] { std::cout << pop() << ' '; }>()) + }>), + Word(".", WordWrap<[] { std::cout << pop() << ' '; }>) ); void getinput() |