\ tag: vocabulary implementation for openbios \ \ Copyright (C) 2003 Stefan Reinauer \ \ See the file "COPYING" for further information about \ the copyright and warranty status of this work. \ \ \ this is an implementation of DPANS94 wordlists (SEARCH EXT) \ 16 constant #vocs create vocabularies #vocs cells allot \ word lists ['] vocabularies to context : search-wordlist ( c-addr u wid -- 0 | xt 1 | xt -1 ) \ Find the definition identified by the string c-addr u in the word \ list identified by wid. If the definition is not found, return zero. \ If the definition is found, return its execution token xt and \ one (1) if the definition is immediate, minus-one (-1) otherwise. find-wordlist if true over immediate? if negate then else 2drop false then ; : wordlist ( -- wid ) \ Creates a new empty word list, returning its word list identifier \ wid. The new word list may be returned from a pool of preallocated \ word lists or may be dynamically allocated in data space. A system \ shall allow the creation of at least 8 new word lists in addition \ to any provided as part of the system. here 0 , ; : get-order ( -- wid1 .. widn n ) #order @ 0 ?do #order @ i - 1- cells context + @ loop #order @ ; : set-order ( wid1 .. widn n -- ) dup -1 = if drop forth-last 1 \ push system default word list and number of lists then dup #order ! 0 ?do i cells context + ! loop ; : order ( -- ) \ display word lists in the search order in their search order sequence \ from the first searched to last searched. Also display word list into \ which new definitions will be placed. cr get-order 0 ?do ." wordlist " i (.) type 2e emit space u. cr loop cr ." definitions: " current @ u. cr ; : previous ( -- ) \ Transform the search order consisting of widn, ... wid2, wid1 (where \ wid1 is searched first) into widn, ... wid2. An ambiguous condition \ exists if the search order was empty before PREVIOUS was executed. get-order nip 1- set-order ; : do-vocabulary ( -- ) \ implementation factor does> @ >r ( ) ( R: widnew ) get-order swap drop ( wid1 ... widn-1 n ) r> swap set-order ; : discard ( x1 .. xu u - ) \ implementation factor 0 ?do drop loop ; : vocabulary ( >name -- ) wordlist create , do-vocabulary ; : also ( -- ) get-order over swap 1+ set-order ; : only ( -- ) -1 set-order also ; only \ create forth forth-wordlist , do-vocabulary create forth get-order over , discard do-vocabulary : findw ( c-addr -- c-addr 0 | w 1 | w -1 ) 0 ( c-addr 0 ) #order @ 0 ?do over count ( c-addr 0 c-addr' u ) i cells context + @ ( c-addr 0 c-addr' u wid ) search-wordlist ( c-addr 0; 0 | w 1 | w -1 ) ?dup if ( c-addr 0; w 1 | w -1 ) 2swap 2drop leave ( w 1 | w -1 ) then ( c-addr 0 ) loop ( c-addr 0 | w 1 | w -1 ) ; : get-current ( -- wid ) current @ ; : set-current ( wid -- ) current ! ; : definitions ( -- ) \ Make the compilation word list the same as the first word list in \ the search order. Specifies that the names of subsequent definitions \ will be placed in the compilation word list. \ Subsequent changes in the search order will not affect the \ compilation word list. context @ set-current ; : forth-wordlist ( -- wid ) forth-last ; : #words ( -- ) 0 last begin @ ?dup while swap 1+ swap repeat cr ; true to vocabularies?