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
 |