In implementing the Retro 12 kernel (called Rx) I had to decide on what functionality would be needed. It was important to me that this be kept clean and minimalistic, as I didn't want to spend a lot of time changing it as time progressed. It's far nicer to code at the higher level, where the Retro language is functional, as opposed to writing more assembly code. So what made it in? Primitives These are words that map directly to Nga instructions. dup drop swap call eq? -eq? lt? gt? fetch store + - * /mod and or xor shift push pop 0; Memory fetch-next store-next , s, Strings s:to-number s:eq? s:length Flow Control choose if -if repeat again Compiler & Interpreter Compiler Heap ; [ ] Dictionary d:link d:class d:xt d:name d:add-header class:word class:primitive class:data class:macro prefix:: prefix:# prefix:& prefix:$ interpret d:lookup err:notfound I *could* slightly reduce this. The $ prefix could be defined in higher level code, and I don't strictly *need* to expose the `fetch-next` and `store-next` here. But since the are already implemented as dependencies of the words in the kernel, it would be a bit wasteful to redefine them later in higher level code. With these words the rest of the language can be built up. Note that the Rx kernel does not provide any I/O words. It's assumed that the Retro interfaces will add these as best suited for the systems they run on. There is another small bit. All images start with a few key pointers in fixed offsets of memory. These are: | Offset | Contains | | ------ | --------------------------- | | 0 | lit call nop nop | | 1 | Pointer to main entry point | | 2 | Dictionary | | 3 | Heap | | 4 | Retro version identifier | An interface can use the dictionary pointer and knowledge of the dictionary format for a specific Retro version to identify the location of essential words like `interpret` and `err:notfound` when implementing the user facing interface.