Annotation of qemu/roms/openbios/forth/lib/vocabulary.fs, revision 1.1

1.1     ! root        1: \ tag: vocabulary implementation for openbios
        !             2: \ 
        !             3: \ Copyright (C) 2003 Stefan Reinauer
        !             4: \ 
        !             5: \ See the file "COPYING" for further information about
        !             6: \ the copyright and warranty status of this work.
        !             7: \ 
        !             8: 
        !             9: \ 
        !            10: \ this is an implementation of DPANS94 wordlists (SEARCH EXT)
        !            11: \ 
        !            12: 
        !            13: 
        !            14: 16 constant #vocs
        !            15: create vocabularies #vocs cells allot \ word lists
        !            16: ['] vocabularies to context
        !            17: 
        !            18: : search-wordlist ( c-addr u wid -- 0 | xt 1 | xt -1 )
        !            19:   \ Find the definition identified by the string c-addr u in the word 
        !            20:   \ list identified by wid. If the definition is not found, return zero. 
        !            21:   \ If the definition is found, return its execution token xt and
        !            22:   \ one (1) if the definition is immediate, minus-one (-1) otherwise.
        !            23:   find-wordlist
        !            24:   if
        !            25:     true over immediate? if
        !            26:       negate
        !            27:     then
        !            28:   else
        !            29:     2drop false
        !            30:   then
        !            31:   ;
        !            32: 
        !            33: : wordlist ( -- wid )
        !            34:   \ Creates a new empty word list, returning its word list identifier 
        !            35:   \ wid. The new word list may be returned from a pool of preallocated 
        !            36:   \ word lists or may be dynamically allocated in data space. A system 
        !            37:   \ shall allow the creation of at least 8 new word lists in addition 
        !            38:   \ to any provided as part of the system.
        !            39:   here 0 ,
        !            40:   ;
        !            41: 
        !            42: : get-order ( -- wid1 .. widn n )
        !            43:   #order @ 0 ?do
        !            44:     #order @ i - 1- cells context + @
        !            45:   loop
        !            46:   #order @
        !            47:   ;
        !            48: 
        !            49: : set-order ( wid1 .. widn n -- )
        !            50:   dup -1 = if
        !            51:     drop forth-last 1 \ push system default word list and number of lists
        !            52:   then
        !            53:   dup #order !
        !            54:   0 ?do 
        !            55:     i cells context + ! 
        !            56:   loop
        !            57:   ;
        !            58: 
        !            59: : order ( -- )
        !            60:   \ display word lists in the search order in their search order sequence
        !            61:   \ from the first searched to last searched. Also display word list into
        !            62:   \ which new definitions will be placed. 
        !            63:   cr
        !            64:   get-order 0 ?do
        !            65:     ." wordlist " i (.) type 2e emit space u. cr
        !            66:   loop
        !            67:   cr ." definitions: " current @ u. cr
        !            68:   ;
        !            69:  
        !            70:   
        !            71: : previous ( -- )
        !            72:   \ Transform the search order consisting of widn, ... wid2, wid1 (where 
        !            73:   \ wid1 is searched first) into widn, ... wid2. An ambiguous condition 
        !            74:   \ exists if the search order was empty before PREVIOUS was executed.
        !            75:   get-order nip 1- set-order 
        !            76:   ;
        !            77:  
        !            78:   
        !            79: : do-vocabulary ( -- ) \ implementation factor
        !            80:   does> 
        !            81:     @ >r               (  ) ( R: widnew )
        !            82:     get-order swap drop        ( wid1 ... widn-1 n )
        !            83:     r> swap set-order
        !            84:   ;
        !            85: 
        !            86: : discard ( x1 .. xu u - ) \ implementation factor
        !            87:   0 ?do 
        !            88:     drop 
        !            89:   loop
        !            90:   ;
        !            91: 
        !            92: : vocabulary ( >name -- )
        !            93:   wordlist create , do-vocabulary
        !            94:   ;
        !            95: 
        !            96: : also  ( -- )
        !            97:   get-order over swap 1+ set-order
        !            98:   ;
        !            99: 
        !           100: : only  ( -- ) 
        !           101:   -1 set-order also
        !           102:   ;
        !           103:  
        !           104: only
        !           105: 
        !           106: \ create forth forth-wordlist , do-vocabulary
        !           107: create forth get-order over , discard do-vocabulary
        !           108: 
        !           109: : findw  ( c-addr -- c-addr 0 | w 1 | w -1 )
        !           110:   0                    ( c-addr 0 )
        !           111:   #order @ 0 ?do
        !           112:     over count                 ( c-addr 0 c-addr' u       )
        !           113:     i cells context + @ ( c-addr 0 c-addr' u wid   )
        !           114:     search-wordlist    ( c-addr 0; 0 | w 1 | w -1 )
        !           115:     ?dup if            ( c-addr 0; w 1 | w -1     )
        !           116:       2swap 2drop leave ( w 1 | w -1 )
        !           117:     then                ( c-addr 0   )
        !           118:   loop                 ( c-addr 0 | w 1 | w -1    )
        !           119:   ;
        !           120: 
        !           121: : get-current ( -- wid )
        !           122:   current @
        !           123:   ;
        !           124: 
        !           125: : set-current ( wid -- )
        !           126:   current !
        !           127:   ;
        !           128: 
        !           129: : definitions ( -- )
        !           130:   \ Make the compilation word list the same as the first word list in 
        !           131:   \ the search order. Specifies that the names of subsequent definitions 
        !           132:   \ will be placed in the compilation word list.
        !           133:   \ Subsequent changes in the search order will not affect the 
        !           134:   \ compilation word list.
        !           135:   context @ set-current
        !           136:   ;
        !           137:   
        !           138: : forth-wordlist ( -- wid )
        !           139:   forth-last
        !           140:   ;
        !           141: 
        !           142: : #words ( -- )
        !           143:   0 last
        !           144:   begin 
        !           145:     @ ?dup 
        !           146:   while
        !           147:     swap 1+ swap
        !           148:   repeat
        !           149:   
        !           150:   cr
        !           151:   ;
        !           152:  
        !           153: true to vocabularies?

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.