* Pictured numeric output conversion (e.g. `<# #>`)
* Words for unsigned integers: `U. U< UM* UM/MOD`
* `>NUMBER`
-* `FIND`
**Missing** core extensions:
```
yes 6.1.1370 EXECUTE
yes 6.1.1380 EXIT
yes 6.1.1540 FILL
- 6.1.1550 FIND
+yes 6.1.1550 FIND
yes 6.1.1561 FM/MOD
yes 6.1.1650 HERE
6.1.1670 HOLD
T{ GT2 EXECUTE -> 123 }T
HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
-\ T{ GT1STRING FIND -> ' GT1 -1 }T
-\ T{ GT2STRING FIND -> ' GT2 1 }T
+T{ GT1STRING FIND -> ' GT1 -1 }T
+T{ GT2STRING FIND -> ' GT2 1 }T
\ ( HOW TO SEARCH FOR NON-EXISTENT WORD? )
T{ : GT3 GT2 LITERAL ; -> }T
T{ GT3 -> ' GT1 }T
dict.addDefinition(word);
state.push(addr);
};
-void tick(State& state)
+void find(State& state, Word word)
{
- auto word = getword(state);
if (auto j = state.dict.find(word); j > 0) {
state.push(state.dict.getexec(j));
auto imm = state.dict.read(j) & Dictionary::Immediate;
state.compiling(true);
break;
case 23: // tick
- tick(state);
+ find(state, getword(state));
break;
case 24: // execute
index = state.pop();
state.load(st);
}
break;
+ case 33: // find
+ {
+ const Addr caddr = state.pop();
+ const Word word {
+ static_cast<Addr>(caddr + 1),
+ static_cast<Addr>(caddr + 1 + state.dict.readbyte(caddr))
+ };
+ find(state, word);
+ }
+ break;
default:
state.push(index - WordCount);
break;
class CoreWords
{
public:
- constexpr static std::size_t WordCount = 33;
+ constexpr static std::size_t WordCount = 34;
constexpr static int Semicolon = 26;
/**
"<\0&\0|\0^\0"
"<<\0>>\0:\0_'\0execute\0"
"exit\0;\0_jmp0\0_jmp\0"
- "depth\0_rdepth\0_in\0_ev\0";
+ "depth\0_rdepth\0_in\0_ev\0find\0";
};
#endif // ALEEFORTH_COREWORDS_HPP