Wordlists are the building block of the dictionary. A wordlist is a single linked list of entries. Entries are compiled colon words, assembly words or data structures created with create. The link chain ends when the next pointer is zero. A wordlist grows usually upward in the flash memory, while the links point downwards.
The anchor of a wordlist is the stored in an EEPROM cell, which address is the wordlist identifier.
Walking a wordlist requires the following steps
- get the WID (e.g. environment)
- read the starting address from the EEPROM (line 2) It the name field address of the first word.
- start the loop until zero is reached (lines 4+5)
- keep the vital iterator data (line 6)
- do some work with the entry, consuming the NFA-copy from the previous line (line 7)
- go to the next entry (line 8)
- repeat the loop body
The implementation of the word show-wordlist may illustrate this:
1 2 3 4 5 6 7 8 9 10
: show-wordlist ( wid -- ) @e begin ?dup while dup icount $ff and itype space nfa>lfa @i repeat ;
The sequence $ff and masks the entry flags (e.g. immediate) and extracts the actual string length for use with the following itype.
Way easier is using the
traverse-wordlist available since amforth version 5.2.
With it, the above changes to
\ print the name of a single wordlist entry : show-word ( nt -- flag ) name>string itype space true \ see spec of traverse-wordlist : show-wordlist ( wid -- ) ['] show-word swap traverse-wordlist ;