File:  [gforth] / gforth / search.fs
Revision 1.13: download - view: text, annotated - select for diffs
Fri Dec 3 18:24:23 1999 UTC (21 years, 11 months ago) by crook
Branches: MAIN
CVS tags: HEAD
Fixed (my earlier) errors in the documentation of Standard search words
in search.fs. Minor documentation tweaks in the other files.

    1: \ search order wordset                                 14may93py
    2: 
    3: \ Copyright (C) 1995,1996,1997,1998 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 ) \ search
   27:   \G @i{wid} is the identifier of the current compilation word list.
   28:   current @ ;
   29: 
   30: : set-current  ( wid -- )  \ search
   31:   \G Set the compilation word list to the word list identified by @i{wid}.
   32:   current ! ;
   33: 
   34: :noname ( -- addr )
   35:     vp dup @ cells + ;
   36: is context
   37: 
   38: : vp! ( u -- )
   39:     vp ! ;
   40: : definitions  ( -- ) \ search
   41:   \G Set the compilation word list to be the same as the word list
   42:   \G that is currently at the top of the search order.
   43:   context @ current ! ;
   44: 
   45: \ wordlist Vocabulary also previous                    14may93py
   46: 
   47: Variable slowvoc   0 slowvoc !
   48: 
   49: \ Forth-wordlist AConstant Forth-wordlist
   50: 
   51: : mappedwordlist ( map-struct -- wid )	\ gforth
   52: \G Create a wordlist with a special map-structure.
   53:   here swap A, 0 A, voclink @ A, 0 A,
   54:   dup wordlist-link voclink !
   55:   dup initvoc ;
   56: 
   57: : wordlist  ( -- wid ) \ search
   58:   \G Create a new, empty word list represented by @i{wid}.
   59:   slowvoc @
   60:   IF    \ this is now f83search because hashing may be loaded already
   61: 	\ jaw
   62: 	f83search 
   63:   ELSE  Forth-wordlist wordlist-map @   THEN
   64:   mappedwordlist ;
   65: 
   66: : Vocabulary ( "name" -- ) \ gforth
   67:   \G Create a definition "name" and associate a new word list with it.
   68:   \G The run-time effect of "name" is to replace the @i{wid} at the
   69:   \G top of the search order with the @i{wid} associated with the new
   70:   \G word list.
   71:   Create wordlist drop  DOES> context ! ;
   72: 
   73: : check-maxvp ( n -- )
   74:     maxvp > -49 and throw ;
   75: 
   76: : push-order ( wid -- ) \ gforth
   77:     \g Push @var{wid} on the search order.
   78:     vp @ 1+ dup check-maxvp vp! context ! ;
   79: 
   80: : also  ( -- ) \ search-ext
   81:   \G Perform a @code{DUP} on the @var{wid} at the top of the search
   82:   \G order. Usually used prior to @code{Forth} etc.
   83:   context @ push-order ;
   84: 
   85: : previous ( -- ) \ search-ext
   86:   \G Perform a @code{DROP} on the @i{wid} at the top of the search
   87:   \G order, thereby removing the @i{wid} from the search order.
   88:   vp @ 1- dup 0= -50 and throw vp! ;
   89: 
   90: \ vocabulary find                                      14may93py
   91: 
   92: : (vocfind)  ( addr count wid -- nfa|false )
   93:     \ !! generalize this to be independent of vp
   94:     drop vp dup @ 1- cells over +
   95:     DO  2dup I 2@ over <>
   96:         IF  (search-wordlist) dup
   97: 	    IF  nip nip  UNLOOP EXIT
   98: 	    THEN  drop
   99:         ELSE  drop 2drop  THEN
  100:     [ -1 cells ] Literal +LOOP
  101:     2drop false ;
  102: 
  103: 0 value locals-wordlist
  104: 
  105: : (localsvocfind)  ( addr count wid -- nfa|false )
  106:     \ !! use generalized (vocfind)
  107:     drop locals-wordlist
  108:     IF 2dup locals-wordlist (search-wordlist) dup
  109: 	IF nip nip
  110: 	    EXIT
  111: 	THEN drop
  112:     THEN
  113:     0 (vocfind) ;
  114: 
  115: \ In the kernel the dictionary search works on only one wordlist.
  116: \ The following stuff builds a thing that looks to the kernel like one
  117: \ wordlist, but when searched it searches the whole search order
  118: \  (including locals)
  119: 
  120: \ this is the wordlist-map of the dictionary
  121: Create vocsearch ( -- wordlist-map )
  122: ' (localsvocfind) A, ' (reveal) A,  ' drop A, ' drop A,
  123: 
  124: \ create dummy wordlist for kernel
  125: slowvoc on
  126: vocsearch mappedwordlist \ the wordlist structure ( -- wid )
  127: 
  128: \ we don't want the dummy wordlist in our linked list
  129: 0 Voclink !
  130: slowvoc off
  131: 
  132: \ Only root                                            14may93py
  133: 
  134: Vocabulary Forth ( -- ) \ gforthman- search-ext
  135:   \G Replace the @i{wid} at the top of the search order with the
  136:   \G @i{wid} associated with the word list @code{forth-wordlist}.
  137: 
  138: 
  139: Vocabulary Root ( -- ) \ gforth
  140:   \G Add the vocabulary @code{Root} to the search order stack.
  141:   \G This vocabulary makes up the minimum search order and
  142:   \G contains these words: @code{order} @code{set-order}
  143:   \G @code{forth-wordlist} @code{Forth} @code{words}
  144: 
  145: : Only ( -- ) \ search-ext
  146:   \G Set the search order to the implementation-defined minimum search
  147:   \G order (for Gforth, this is the word list @code{Root}).
  148:   1 vp! Root also ;
  149: 
  150: \ set initial search order                             14may93py
  151: 
  152: Forth-wordlist wordlist-id @ ' Forth >body wordlist-id !
  153: 
  154: 0 vp! also Root also definitions
  155: Only Forth also definitions
  156: lookup ! \ our dictionary search order becomes the law ( -- )
  157: 
  158: ' Forth >body to Forth-wordlist \ "forth definitions get-current" and "forth-wordlist" should produce the same wid
  159: 
  160: 
  161: \ get-order set-order                                  14may93py
  162: 
  163: : get-order  ( -- widn .. wid1 n ) \ search
  164:   \G Copy the search order to the data stack. The current search order
  165:   \G has @i{n} entries, of which @i{wid1} represents the word list
  166:   \G that is searched first (the word list at the top of the search
  167:   \G order) and @i{widn} represents the word order that is searched
  168:   \G last.
  169:   vp @ 0 ?DO vp cell+ I cells + @ LOOP vp @ ;
  170: 
  171: : set-order  ( widn .. wid1 n -- ) \ gforthman- search
  172:     \G If @var{n}=0, empty the search order.  If @var{n}=-1, set the
  173:     \G search order to the implementation-defined minimum search order
  174:     \G (for Gforth, this is the word list @code{Root}). Otherwise,
  175:     \G replace the existing search order with the @var{n} wid entries
  176:     \G such that @var{wid1} represents the word list that will be
  177:     \G searched first and @var{widn} represents the word list that will
  178:     \G be searched last.
  179:     dup -1 = IF
  180: 	drop only exit
  181:     THEN
  182:     dup check-maxvp
  183:     dup vp!
  184:     ?dup IF 1- FOR vp cell+ I cells + !  NEXT THEN ;
  185: 
  186: : seal ( -- ) \ gforth
  187:   \G Remove all word lists from the search order stack other than the word
  188:   \G list that is currently on the top of the search order stack.
  189:   context @ 1 set-order ;
  190: 
  191: : .voc
  192:     body> >head name>string type space ;
  193: 
  194: : order ( -- )  \  gforthman- search-ext
  195:   \G Print the search order and the compilation word list.  The
  196:   \G word lists are printed in the order in which they are searched
  197:   \G (which is reversed with respect to the conventional way of
  198:   \G displaying stacks). The compilation word list is displayed last.
  199:   \ The standard requires that the word lists are printed in the order
  200:   \ in which they are searched. Therefore, the output is reversed
  201:   \ with respect to the conventional way of displaying stacks.
  202:     get-order 0
  203:     ?DO
  204: 	.voc
  205:     LOOP
  206:     4 spaces get-current .voc ;
  207: 
  208: : vocs ( -- ) \ gforth
  209:     \G List vocabularies and wordlists defined in the system.
  210:     voclink
  211:     BEGIN
  212: 	@ dup
  213:     WHILE
  214: 	dup 0 wordlist-link - .voc
  215:     REPEAT
  216:     drop ;
  217: 
  218: Root definitions
  219: 
  220: ' words Alias words  ( -- ) \ tools
  221: \G Display a list of all of the definitions in the word list at the top
  222: \G of the search order.
  223: ' Forth Alias Forth
  224: ' forth-wordlist alias forth-wordlist ( -- wid ) \ search
  225:   \G @code{Constant} -- @i{wid} identifies the word list that includes all of the standard words
  226:   \G provided by Gforth. When Gforth is invoked, this word list is the compilation word
  227:   \G list and is at the top of the search order.
  228: ' set-order alias set-order
  229: ' order alias order
  230: 
  231: Forth definitions
  232: 

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