76 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			76 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Factor
		
	
	
|  | ! Copyright (C) 2009 Jose Antonio Ortega Ruiz. | ||
|  | ! See http://factorcode.org/license.txt for BSD license. | ||
|  | USING: accessors arrays compiler.units continuations debugger | ||
|  | fuel.pprint io io.streams.string kernel namespaces parser sequences | ||
|  | vectors vocabs.parser ;
 | ||
|  | 
 | ||
|  | IN: fuel.eval | ||
|  | 
 | ||
|  | TUPLE: fuel-status in use restarts ;
 | ||
|  | 
 | ||
|  | SYMBOL: fuel-status-stack | ||
|  | V{ } clone fuel-status-stack set-global
 | ||
|  | 
 | ||
|  | SYMBOL: fuel-eval-result | ||
|  | f fuel-eval-result set-global
 | ||
|  | 
 | ||
|  | SYMBOL: fuel-eval-output | ||
|  | f fuel-eval-result set-global
 | ||
|  | 
 | ||
|  | SYMBOL: fuel-eval-res-flag | ||
|  | t fuel-eval-res-flag set-global
 | ||
|  | 
 | ||
|  | : fuel-eval-restartable? ( -- ? )
 | ||
|  |     fuel-eval-res-flag get-global ; inline
 | ||
|  | 
 | ||
|  | : fuel-push-status ( -- )
 | ||
|  |     in get use get clone restarts get-global clone
 | ||
|  |     fuel-status boa
 | ||
|  |     fuel-status-stack get push ;
 | ||
|  | 
 | ||
|  | : fuel-pop-restarts ( restarts -- )
 | ||
|  |     fuel-eval-restartable? [ drop ] [ clone restarts set-global ] if ; inline
 | ||
|  | 
 | ||
|  | : fuel-pop-status ( -- )
 | ||
|  |     fuel-status-stack get empty? [ | ||
|  |         fuel-status-stack get pop
 | ||
|  |         [ in>> in set ] | ||
|  |         [ use>> clone use set ] | ||
|  |         [ restarts>> fuel-pop-restarts ] tri
 | ||
|  |     ] unless ;
 | ||
|  | 
 | ||
|  | : fuel-forget-error ( -- ) f error set-global ; inline
 | ||
|  | : fuel-forget-result ( -- ) f fuel-eval-result set-global ; inline
 | ||
|  | : fuel-forget-output ( -- ) f fuel-eval-output set-global ; inline
 | ||
|  | : fuel-forget-status ( -- )
 | ||
|  |     fuel-forget-error fuel-forget-result fuel-forget-output ; inline
 | ||
|  | 
 | ||
|  | : fuel-send-retort ( -- )
 | ||
|  |     error get fuel-eval-result get-global fuel-eval-output get-global
 | ||
|  |     3array fuel-pprint flush nl "<~FUEL~>" write nl flush ;
 | ||
|  | 
 | ||
|  | : (fuel-begin-eval) ( -- )
 | ||
|  |     fuel-push-status fuel-forget-status ; inline
 | ||
|  | 
 | ||
|  | : (fuel-end-eval) ( output -- )
 | ||
|  |     fuel-eval-output set-global fuel-send-retort fuel-pop-status ; inline
 | ||
|  | 
 | ||
|  | : (fuel-eval) ( lines -- )
 | ||
|  |     [ [ parse-lines ] with-compilation-unit call ] curry
 | ||
|  |     [ print-error ] recover ; inline
 | ||
|  | 
 | ||
|  | : (fuel-eval-each) ( lines -- )
 | ||
|  |     [ 1vector (fuel-eval) ] each ; inline
 | ||
|  | 
 | ||
|  | : (fuel-eval-usings) ( usings -- )
 | ||
|  |     [ "USING: " prepend " ;" append ] map
 | ||
|  |     (fuel-eval-each) fuel-forget-error fuel-forget-output ;
 | ||
|  | 
 | ||
|  | : (fuel-eval-in) ( in -- )
 | ||
|  |     [ dup "IN: " prepend 1vector (fuel-eval) in set ] when* ; inline
 | ||
|  | 
 | ||
|  | : (fuel-eval-in-context) ( lines in usings -- )
 | ||
|  |     (fuel-begin-eval) | ||
|  |     [ (fuel-eval-usings) (fuel-eval-in) (fuel-eval) ] with-string-writer | ||
|  |     (fuel-end-eval) ;
 |