Annotation of gforth/compat/execute-parsing.fs, revision 1.2

1.1       anton       1: \ implementation of EXECUTE-PARSING
                      2: 
                      3: \ This file is in the public domain. NO WARRANTY.
                      4: 
                      5: \ execute-parsing   ( ... c-addr u xt - ... )
                      6: \ 
                      7: \ Make c-addr u the current input source, execute xt ( ... -- ... ),
                      8: \ then restore the previous input source.
                      9: \ 
                     10: \ This word is used like this:
                     11: \ 
                     12: \ s" test" ' create execute-parsing
                     13: \ 
                     14: \ and this would be equivalent to 
                     15: \ 
                     16: \ create test
                     17: \ 
                     18: \ It can be used to provide the input-stream input of a parsing word
                     19: \ without consuming the input stream of the calling word.
                     20: 
                     21: \ this implementation copies the string to be parsed elsewhere (while
                     22: \ EVALUATE is required to work in-place)
                     23: 
                     24: \ The program uses the following words
                     25: \ from CORE :
                     26: \  Constant : execute source >in ! drop ; >r 1+ r> swap dup chars + r@ move 
                     27: \  rot ['] 
                     28: \ from BLOCK :
                     29: \  evaluate 
                     30: \ from BLOCK-EXT :
                     31: \  \ 
                     32: \ from EXCEPTION :
                     33: \  throw catch 
                     34: \ from FILE :
                     35: \  ( S" 
                     36: \ from MEMORY :
                     37: \  allocate free 
                     38: \ from SEARCH :
                     39: \  wordlist get-current set-current get-order set-order 
                     40: \ from SEARCH-EXT :
                     41: \  previous 
                     42: 
                     43: wordlist constant execute-parsing-wordlist
                     44: 
                     45: get-current execute-parsing-wordlist set-current
                     46: 
                     47: \ X is prepended to the string, then the string is EVALUATEd
                     48: : X ( xt -- )
                     49:     previous execute
1.2     ! anton      50:     source >in ! drop ; immediate \ skip remaining input
1.1       anton      51: 
                     52: set-current
                     53: 
                     54: : >order ( wid -- )
                     55:   >r get-order 1+ r> swap set-order ;
                     56: 
                     57: : execute-parsing ( ... c-addr u xt -- ... )
                     58:     >r dup >r
                     59:     dup 2 chars + allocate throw >r  \ construct the string to be EVALUATEd
                     60:     s" X " r@ swap chars move
                     61:     r@ 2 chars + swap chars move
                     62:     r> r> 2 + r> rot dup >r rot ( xt c-addr1 u1 r: c-addr1 )
                     63:     execute-parsing-wordlist >order  \ make sure the right X is executed
                     64:     ['] evaluate catch               \ now EVALUATE the string
                     65:     r> free throw throw ;            \ cleanup

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