\ 4tH library - EVALUATE - Copyright 2005,2008 J.L. Bezemer \ You can redistribute this file and/or modify it under \ the terms of the GNU General Public License [UNDEFINED] interpret [IF] [NEEDS lib/interprt.4th] [THEN] 4 [DEFINED] block [IF] 1 [+] [THEN] constant /input \ the number of items on stack [UNDEFINED] evaluate [IF] \ this routine evaluates a string : save-input ( ( -- n1 n2 a n3 h n4) [DEFINED] block [IF] \ only if BLOCK has been defined blk @ \ save also the block number [THEN] \ save >IN, buffer and channel >in @ source cin /input ( -- n1 a n2 h) ; : restore-input ( n1 n2 a n3 h n4 -- f) swap cin <> dup >r \ check if input channel has changed if \ if true, drop all items 1- 0 do drop loop else \ otherwise restore >IN and buffer drop source! >in ! [DEFINED] block [IF] \ only if BLOCK has been defined block drop \ reload the block [THEN] then r> \ retrieve the flag ; \ interpret contents of a buffer : (evaluate) ( x xt --) save-input dup 1- begin rot >r dup while 1- repeat drop >r execute source! 0 >in ! ['] interpret catch drop r> dup 1- begin r> -rot dup while 1- repeat drop restore-input throw ; \ interpret a named buffer : evaluate :noname ; (evaluate) ; ( a n --) \ interpret the contents of a block [DEFINED] block [IF] \ only if BLOCK has been defined : load :noname block c/scr ; (evaluate) ; [THEN] ( n --) [DEFINED] 4TH# [IF] hide (evaluate) hide /input [THEN] [THEN]