Problem
The X:structures extension defines FIELD: as:
10.6.2.xxxx FIELD: "field-colon" FACILITY EXT
( -- ) X:structures
-
The semantics of
FIELD: are identical to the execution semantics
of the phrase:
ALIGNED 1 CELLS +FIELD
- See:
-
10.6.2.----
+FIELD , 10.6.2.---- BEGIN-STRUCTURE and
10.6.2.---- END-STRUCTURE .
While this is a very concise definition, there are a few difficulties
with it:
- The stack description is incorrect, it should be:
( n1 "<spaces>name" -- n2 )
- It defines a child word which is not described. Normally this is
described in a "name Execution" clause.
- There is no actual description of the word, simply what amounts
to a reference implementation.
This applies to CFIELD: , DFFIELD: , FFIELD: and SFFIELD: as well.
Solution
Replace the definition of FIELD: and friends with:
10.6.2.xxxx FIELD: "field-colon" FACILITY EXT
( n1 "<spaces>name" -- n2 ) X:structures
-
Skip leading space delimiters. Parse name delimited by a space.
Offset is the first cell aligned value greater than or equal to
n1. n2 = offset + 1 cells.
Create a definition for name with the execution semantics given
below.
- name Execution: ( a-addr1 -- a-addr2 )
-
Add the offset calculated during the compile time action to
a-addr1 giving the cell aligned address a-addr2.
- See:
-
10.6.2.----
BEGIN-STRUCTURE , A.10.6.---- BEGIN-STRUCTURE ,
A.10.6.2.---- FIELD:
Proposal
Modify the definition of the following words in accordance with the
text given in the Solution, above, with the modification of the
alignment as follows:
FIELD: | cell aligned |
CFIELD: | character aligned |
FFIELD: | float aligned |
SFFIELD: | single-float aligned |
DFFIELD: | double-float aligned |
Add the following as the Rationale for 10.6.2.---- FIELD:
A.10.6.2.xxxx FIELD:
Create an aligned single cell field in a data structure.
The various xFIELD: words provide for different alignment and
size allocation.
The xFIELD: words could be defined as:
: FIELD: ALIGNED 1 CELLS +FIELD ; \ cell aligned
: CFIELD: 1 CHARS +FIELD ; \ character aligned
: FFIELD: FALIGNED 1 FLOATS +FIELD ; \ float aligned
: SFFIELD: SFALIGNED 1 SFLOATS +FIELD ; \ single-float aligned
: DFFIELD: DFALIGNED 1 DFLOATS +FIELD ; \ double-float aligned
|