CREATE DOES>
The tokenizer/evaluator handling of DOES> follows the ANS standard.
The builder handling of DOES> is not standard. In the case of the builder, the code after DOES> can't execute on the host PC. Defining words can only define words that execute on the target. These defining words are defined in host mode. When IDOES> is encountered, the interpreter switches to building mode and compiles the code to be executed at run time. Semicolon switches back to host mode.
IDOES> provides an elegant way to associate code and data. It patches the last ICREATE or IPCREATE code by replacing its return instruction with a jump to the IDOES> code.
Example 1. Simple data structure in ROM.
<builder> | Place the following definition(s) in BUILDER | |
: mydef | ( n1 n2 <name> -- ) | Compilation semantics |
( -- n1 n2 ) | Execution semantics | |
ipcreate i, i, | Create a data structure in program space | |
idoes> dup @p swap cell+ @p swap | Read double from program space | |
; | ||
</builder> | Switch back to ROM building | |
100 200 | mydef foo1 | Switch back to ROM building |
Example 2. Voltage reading.
<builder> | Place the following definition(s) in BUILDER | |
: voltage | ( zero span channel <name> -- ) | Compilation semantics |
( -- millivolts ) | Execution semantics | |
icreate i, swap i, i, | Create a data structure in data space | |
idoes> a! @a+ ADC@ | Read raw ADC data | |
@a+ - | Subtract the zero point | |
@a+ m* nip | Scale by span | |
; | Conveniently ignore calibration issues. | |
</builder> | Switch back to ROM building | |
-2 20000 0 | voltage outside_temp | Define a voltage reading word |