53 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			53 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2008 Slava Pestov.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: accessors namespaces kernel assocs sequences
							 | 
						||
| 
								 | 
							
								stack-checker.recursive-state ;
							 | 
						||
| 
								 | 
							
								IN: stack-checker.values
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Values
							 | 
						||
| 
								 | 
							
								: <value> ( -- value ) \ <value> counter ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								SYMBOL: known-values
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: init-known-values ( -- )
							 | 
						||
| 
								 | 
							
								    H{ } clone known-values set ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: known ( value -- known ) known-values get at ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: set-known ( known value -- )
							 | 
						||
| 
								 | 
							
								    over [ known-values get set-at ] [ 2drop ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: make-known ( known -- value )
							 | 
						||
| 
								 | 
							
								    <value> [ set-known ] keep ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: copy-value ( value -- value' )
							 | 
						||
| 
								 | 
							
								    known make-known ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: copy-values ( values -- values' )
							 | 
						||
| 
								 | 
							
								    [ copy-value ] map ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Literal value
							 | 
						||
| 
								 | 
							
								TUPLE: literal < identity-tuple value recursion hashcode ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: literal hashcode* nip hashcode>> ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: <literal> ( obj -- value )
							 | 
						||
| 
								 | 
							
								    recursive-state get over hashcode \ literal boa ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								GENERIC: (literal) ( value -- literal )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: literal (literal) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: literal ( value -- literal )
							 | 
						||
| 
								 | 
							
								    known (literal) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Result of curry
							 | 
						||
| 
								 | 
							
								TUPLE: curried obj quot ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C: <curried> curried
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! Result of compose
							 | 
						||
| 
								 | 
							
								TUPLE: composed quot1 quot2 ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C: <composed> composed
							 |