title: STRUCTURES, very simple description: : ^FIELD CREATE , DOES> @ + ; ( offset "name" -- offset ) ( name: addr -- addr+offset ) \ base stricture 0 ^FIELD mst^x CELL+ ^FILED mst^y CELL+ ^FIELD mst^a CHAR+ ^FIELD mst^b CHAR+ ALIGNED ^FILED mst^z CELL+ CONSTANT mst-size \ mst for "My STructure" \ derived structure mst-size ^FIELD mst^u CELL+ ^FIELD mst^v CELL+ CONSTANT xmst-size : foo ... ( addr ) mst^x @ ( val ) ... ( val addr ) mst^y ! ; More-complex: : @FIELD CREATE , ( offset "name" -- offset ) DOES> @ + @ ; ( name: addr -- val ) : !FIELD CREATE , ( offset "name" -- offset ) DOES> @ + ! ; ( name: val addr -- ) : C@FIELD CREATE , ( offset "name" -- offset ) DOES> @ + @ ; ( name: addr -- val ) : C!FIELD CREATE , ( offset "name" -- offset ) DOES> @ + ! ; ( name: val addr -- ) 0 ^FIELD xyz^c C@FIELD xyz.c C!FIELD xyz!c CHAR+ ALIGNED ^FIELD xyz^x @FIELD xyz.x !FIELD xyz!x CELL+ CONSTANT /xyz \ Slash "/" stands for "size-of" or : word: ^FIELD @FIELD !FIELD CELL+ ; : byte: ^FIELD C@FIELD C!FIELD CHAR+ ; 0 word: smp^x smp.x smp!x byte: smp^a smp.a smp!a byte: smp^b smp.b smp!b ALIGNED word: smp^z smp.z smp!z CONSTANT /smp Explanation: to be written Page-written-by: mlg Notes: GuidoD most likely would say that ^FIELD should be called +FIELD and that the field selectors must be of the form ->structname.fieldname rather than structname[operation]fieldname . It's a matter of taste. Anyway, to add structures to Forth you need one line of auxiliary code. guidod-comment: to give you an idea of the look with using +FIELD to declare an offset-constant, here is an example 0 +field my.x+ cell+ +field my.y+ cell+ +field my.a+ char+ +field my.a+ char+ aligned +field my.z+ cell+ +field my+ drop 0 my+ buffer: my.buf 42 my.buf my.z+ ! 0 my+ \ extends +field other.w+ cell+ +field other+ drop note that only a single word +FIELD is needed to build a complete series of structure accessors and declarators. Since the words CHAR+ and CELL+ are part of the ANS Forth standard, no other word is needed unlike the case of /FIELD where the usual but not-required words /CELL and /CHAR would be needed, as this: 0 /cell /field ->my.x /cell /field ->my.y /char /field ->my.a /char /field ->my.b aligned /cell /field ->my.z constant /my /my buffer: my.buf 42 my.buf ->my.z ! /my \ extends /cell /field ->other.w constant /other however the latter is a bit more readable and has references in the openboot standard where the simplefield declarator was just called FIELD (which some forth system tooks for another meaning).