Annotation of gforth/search.fs, revision 1.1

1.1     ! anton       1: \ search order wordset                                 14may93py
        !             2: 
        !             3: \ Copyright (C) 1995 Free Software Foundation, Inc.
        !             4: 
        !             5: \ This file is part of Gforth.
        !             6: 
        !             7: \ Gforth is free software; you can redistribute it and/or
        !             8: \ modify it under the terms of the GNU General Public License
        !             9: \ as published by the Free Software Foundation; either version 2
        !            10: \ of the License, or (at your option) any later version.
        !            11: 
        !            12: \ This program is distributed in the hope that it will be useful,
        !            13: \ but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14: \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            15: \ GNU General Public License for more details.
        !            16: 
        !            17: \ You should have received a copy of the GNU General Public License
        !            18: \ along with this program; if not, write to the Free Software
        !            19: \ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            20: 
        !            21: $10 constant maxvp
        !            22: Variable vp
        !            23:   0 A, 0 A,  0 A, 0 A,   0 A, 0 A,   0 A, 0 A, 
        !            24:   0 A, 0 A,  0 A, 0 A,   0 A, 0 A,   0 A, 0 A, 
        !            25: 
        !            26: : get-current  ( -- wid )  current @ ;
        !            27: : set-current  ( wid -- )  current ! ;
        !            28: 
        !            29: : context ( -- addr )  vp dup @ cells + ;
        !            30: : definitions  ( -- )  context @ current ! ;
        !            31: 
        !            32: \ wordlist Vocabulary also previous                    14may93py
        !            33: 
        !            34: AVariable voclink
        !            35: 
        !            36: Defer 'initvoc
        !            37: ' drop ' 'initvoc >body !
        !            38: 
        !            39: Variable slowvoc   slowvoc off
        !            40: 
        !            41: Forth-wordlist AConstant Forth-wordlist
        !            42: 
        !            43: : wordlist  ( -- wid )
        !            44:   here  0 A,
        !            45:   slowvoc @
        !            46:   IF    [ Forth-wordlist wordlist-map @ ] ALiteral
        !            47:   ELSE  Forth-wordlist wordlist-map @   THEN
        !            48:   A, voclink @ A, slowvoc @ A,
        !            49:   dup wordlist-link dup voclink ! 'initvoc ;
        !            50: 
        !            51: : Vocabulary ( -- ) Create wordlist drop  DOES> context ! ;
        !            52: 
        !            53: : also  ( -- )
        !            54:   context @ vp @ 1+ dup maxvp > abort" Vocstack full"
        !            55:   vp ! context ! ;
        !            56: 
        !            57: : previous ( -- )  vp @ 1- dup 0= abort" Vocstack empty" vp ! ;
        !            58: 
        !            59: \ vocabulary find                                      14may93py
        !            60: 
        !            61: : (vocfind)  ( addr count wid -- nfa|false )
        !            62:     \ !! generalize this to be independent of vp
        !            63:     drop vp dup @ 1- cells over +
        !            64:     DO  2dup I 2@ over <>
        !            65:         IF  (search-wordlist) dup
        !            66:            IF  nip nip  UNLOOP EXIT
        !            67:            THEN  drop
        !            68:         ELSE  drop 2drop  THEN
        !            69:     [ -1 cells ] Literal +LOOP
        !            70:     2drop false ;
        !            71: 
        !            72: 0 value locals-wordlist
        !            73: 
        !            74: : (localsvocfind)  ( addr count wid -- nfa|false )
        !            75:     \ !! use generalized (vocfind)
        !            76:     drop locals-wordlist
        !            77:     IF 2dup locals-wordlist (search-wordlist) dup
        !            78:        IF nip nip
        !            79:            EXIT
        !            80:        THEN drop
        !            81:     THEN
        !            82:     0 (vocfind) ;
        !            83: 
        !            84: \ In the kernel the dictionary search works on only one wordlist.
        !            85: \ The following stuff builds a thing that looks to the kernel like one
        !            86: \ wordlist, but when searched it searches the whole search order
        !            87: \  (including locals)
        !            88: 
        !            89: \ this is the wordlist-map of the dictionary
        !            90: Create vocsearch ( -- wordlist-map )
        !            91: ' (localsvocfind) A, ' (reveal) A,  ' drop A,
        !            92: 
        !            93: \ Only root                                            14may93py
        !            94: 
        !            95: wordlist \ the wordlist structure
        !            96: vocsearch over wordlist-map ! \ patch the map into it
        !            97: 
        !            98: Vocabulary Forth
        !            99: Vocabulary Root
        !           100: 
        !           101: : Only  vp off  also Root also definitions ;
        !           102: 
        !           103: \ set initial search order                             14may93py
        !           104: 
        !           105: Forth-wordlist @ ' Forth >body !
        !           106: 
        !           107: vp off  also Root also definitions
        !           108: Only Forth also definitions
        !           109: 
        !           110: lookup ! \ our dictionary search order becomes the law
        !           111: 
        !           112: ' Forth >body to Forth-wordlist \ "forth definitions get-current" and "forth-wordlist" should produce the same wid
        !           113: 
        !           114: 
        !           115: \ get-order set-order                                  14may93py
        !           116: 
        !           117: : get-order  ( -- wid1 .. widn n )
        !           118:   vp @ 0 ?DO  vp cell+ I cells + @  LOOP  vp @ ;
        !           119: 
        !           120: : set-order  ( wid1 .. widn n / -1 -- )
        !           121:   dup -1 = IF  drop Only exit  THEN  dup vp !
        !           122:   ?dup IF  1- FOR  vp cell+ I cells + !  NEXT  THEN ;
        !           123: 
        !           124: : seal ( -- )  context @ 1 set-order ;
        !           125: 
        !           126: \ words visible in roots                               14may93py
        !           127: 
        !           128: : .name ( name -- ) \ gforth   dot-name
        !           129:     name>string type space ;
        !           130: 
        !           131: require termsize.fs
        !           132: 
        !           133: : words ( -- ) \ tools
        !           134:     cr 0 context @
        !           135:     BEGIN
        !           136:        @ dup
        !           137:     WHILE
        !           138:        2dup name>string nip 2 + dup >r +
        !           139:        cols >=
        !           140:        IF
        !           141:            cr nip 0 swap
        !           142:        THEN
        !           143:        dup .name space r> rot + swap
        !           144:     REPEAT
        !           145:     2drop ;
        !           146: 
        !           147: ' words alias vlist ( -- ) \ gforth
        !           148: \g Old (pre-Forth-83) name for @code{WORDS}.
        !           149: 
        !           150: : body> ( data -- cfa )  0 >body - ;
        !           151: 
        !           152: : .voc
        !           153:     body> >name .name ;
        !           154: : order ( -- )  \  search-ext
        !           155:     \g prints the search order and the @code{current} wordlist.  The
        !           156:     \g standard requires that the wordlists are printed in the order
        !           157:     \g in which they are searched. Therefore, the output is reversed
        !           158:     \g with respect to the conventional way of displaying stacks. The
        !           159:     \g @code{current} wordlist is displayed last.
        !           160:     get-order 0
        !           161:     ?DO
        !           162:        .voc
        !           163:     LOOP
        !           164:     4 spaces get-current .voc ;
        !           165: : vocs ( -- ) \ gforth
        !           166:     \g prints vocabularies and wordlists defined in the system.
        !           167:     voclink
        !           168:     BEGIN
        !           169:        @ dup @
        !           170:     WHILE
        !           171:        dup 0 wordlist-link - .voc
        !           172:     REPEAT
        !           173:     drop ;
        !           174: 
        !           175: Root definitions
        !           176: 
        !           177: ' words Alias words
        !           178: ' Forth Alias Forth
        !           179: ' forth-wordlist alias forth-wordlist
        !           180: ' set-order alias set-order
        !           181: ' order alias order
        !           182: 
        !           183: Forth definitions
        !           184: 
        !           185: include hash.fs
        !           186: 
        !           187: \ table (case-sensitive wordlist)
        !           188: 
        !           189: : table-find ( addr len wordlist -- nfa / false )
        !           190:     >r 2dup r> bucket @ (tablefind) ;
        !           191: 
        !           192: Create tablesearch-map ( -- wordlist-map )
        !           193:     ' table-find A, ' hash-reveal A, ' (rehash) A,
        !           194: 
        !           195: : table ( -- wid )
        !           196:     \g create a case-sensitive wordlist
        !           197:     wordlist
        !           198:     tablesearch-map over wordlist-map ! ;
        !           199: 
        !           200: \ marker                                               18dec94py
        !           201: 
        !           202: \ Marker creates a mark that is removed (including everything 
        !           203: \ defined afterwards) when executing the mark.
        !           204: 
        !           205: : marker, ( -- mark )  here dup A,
        !           206:   voclink @ A, voclink
        !           207:   BEGIN  @ dup @  WHILE  dup 0 wordlist-link - @ A,  REPEAT  drop
        !           208:   udp @ , ;
        !           209: 
        !           210: : marker! ( mark -- )
        !           211:     dup @ swap cell+
        !           212:     dup @ voclink ! cell+
        !           213:     voclink
        !           214:     BEGIN
        !           215:        @ dup @ 
        !           216:     WHILE
        !           217:        over @ over 0 wordlist-link - !
        !           218:        swap cell+ swap
        !           219:     REPEAT
        !           220:     drop  voclink
        !           221:     BEGIN
        !           222:        @ dup @
        !           223:     WHILE
        !           224:        dup 0 wordlist-link - rehash
        !           225:     REPEAT
        !           226:     drop
        !           227:     @ udp !  dp ! ;
        !           228: 
        !           229: : marker ( "mark" -- )
        !           230:     marker, Create A,
        !           231: DOES> ( -- )
        !           232:     @ marker! ;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>