2009-11-09 01:17:24 -05:00
|
|
|
! Copyright (C) 2008, 2009 Slava Pestov.
|
2008-11-13 01:07:45 -05:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
USING: accessors namespaces kernel assocs sequences
|
2010-03-07 14:44:44 -05:00
|
|
|
stack-checker.recursive-state stack-checker.errors
|
|
|
|
quotations ;
|
2008-11-13 01:07:45 -05:00
|
|
|
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 ;
|
|
|
|
|
2009-02-06 11:21:55 -05:00
|
|
|
GENERIC: (literal-value?) ( value -- ? )
|
|
|
|
|
2009-11-09 01:17:24 -05:00
|
|
|
: literal-value? ( value -- ? ) known (literal-value?) ;
|
|
|
|
|
|
|
|
GENERIC: (input-value?) ( value -- ? )
|
|
|
|
|
|
|
|
: input-value? ( value -- ? ) known (input-value?) ;
|
2009-02-06 11:21:55 -05:00
|
|
|
|
2009-11-09 01:17:24 -05:00
|
|
|
GENERIC: (literal) ( known -- literal )
|
2009-02-06 11:21:55 -05:00
|
|
|
|
2008-11-13 01:07:45 -05:00
|
|
|
! Literal value
|
2009-11-10 22:06:36 -05:00
|
|
|
TUPLE: literal < identity-tuple value recursion ;
|
2008-11-13 01:07:45 -05:00
|
|
|
|
2009-02-06 11:21:55 -05:00
|
|
|
: literal ( value -- literal ) known (literal) ;
|
|
|
|
|
2009-11-10 22:06:36 -05:00
|
|
|
M: literal hashcode* nip value>> identity-hashcode ;
|
2008-11-13 01:07:45 -05:00
|
|
|
|
|
|
|
: <literal> ( obj -- value )
|
2009-11-10 22:06:36 -05:00
|
|
|
recursive-state get \ literal boa ;
|
2008-11-13 01:07:45 -05:00
|
|
|
|
2009-11-09 01:17:24 -05:00
|
|
|
M: literal (input-value?) drop f ;
|
|
|
|
|
2009-02-06 11:21:55 -05:00
|
|
|
M: literal (literal-value?) drop t ;
|
2008-11-13 01:07:45 -05:00
|
|
|
|
|
|
|
M: literal (literal) ;
|
|
|
|
|
2009-02-06 11:21:55 -05:00
|
|
|
: curried/composed-literal ( input1 input2 quot -- literal )
|
|
|
|
[ [ literal ] bi@ ] dip
|
|
|
|
[ [ [ value>> ] bi@ ] dip call ] [ drop nip recursion>> ] 3bi
|
2009-11-10 22:06:36 -05:00
|
|
|
\ literal boa ; inline
|
2008-11-13 01:07:45 -05:00
|
|
|
|
|
|
|
! Result of curry
|
|
|
|
TUPLE: curried obj quot ;
|
|
|
|
|
|
|
|
C: <curried> curried
|
|
|
|
|
2009-02-06 11:21:55 -05:00
|
|
|
: >curried< ( curried -- obj quot )
|
|
|
|
[ obj>> ] [ quot>> ] bi ; inline
|
|
|
|
|
2009-11-09 01:17:24 -05:00
|
|
|
M: curried (input-value?) >curried< [ input-value? ] either? ;
|
|
|
|
|
2009-02-06 11:21:55 -05:00
|
|
|
M: curried (literal-value?) >curried< [ literal-value? ] both? ;
|
2009-11-09 01:17:24 -05:00
|
|
|
|
2009-02-06 11:21:55 -05:00
|
|
|
M: curried (literal) >curried< [ curry ] curried/composed-literal ;
|
|
|
|
|
2008-11-13 01:07:45 -05:00
|
|
|
! Result of compose
|
|
|
|
TUPLE: composed quot1 quot2 ;
|
|
|
|
|
|
|
|
C: <composed> composed
|
2009-02-06 11:21:55 -05:00
|
|
|
|
|
|
|
: >composed< ( composed -- quot1 quot2 )
|
|
|
|
[ quot1>> ] [ quot2>> ] bi ; inline
|
|
|
|
|
2009-11-09 01:17:24 -05:00
|
|
|
M: composed (input-value?)
|
|
|
|
[ quot1>> input-value? ] [ quot2>> input-value? ] bi or ;
|
|
|
|
|
2009-02-06 11:21:55 -05:00
|
|
|
M: composed (literal-value?) >composed< [ literal-value? ] both? ;
|
2009-11-09 01:17:24 -05:00
|
|
|
|
|
|
|
M: composed (literal) >composed< [ compose ] curried/composed-literal ;
|
|
|
|
|
|
|
|
! Input parameters
|
|
|
|
SINGLETON: input-parameter
|
|
|
|
|
|
|
|
SYMBOL: current-word
|
|
|
|
|
|
|
|
M: input-parameter (input-value?) drop t ;
|
|
|
|
|
|
|
|
M: input-parameter (literal-value?) drop f ;
|
|
|
|
|
|
|
|
M: input-parameter (literal) current-word get unknown-macro-input ;
|
|
|
|
|
2010-03-07 14:44:44 -05:00
|
|
|
! Argument corresponding to polymorphic declared input of inline combinator
|
|
|
|
|
2010-03-07 21:40:58 -05:00
|
|
|
TUPLE: declared-effect known word effect variables branches actual ;
|
2010-03-07 14:44:44 -05:00
|
|
|
|
2010-03-07 21:40:58 -05:00
|
|
|
C: (declared-effect) declared-effect
|
|
|
|
|
|
|
|
: <declared-effect> ( known word effect variables branches -- declared-effect )
|
|
|
|
f (declared-effect) ; inline
|
2010-03-07 14:44:44 -05:00
|
|
|
|
2010-03-07 21:07:42 -05:00
|
|
|
M: declared-effect (input-value?) known>> (input-value?) ;
|
2010-03-07 14:44:44 -05:00
|
|
|
|
2010-03-07 21:07:42 -05:00
|
|
|
M: declared-effect (literal-value?) known>> (literal-value?) ;
|
2010-03-07 14:44:44 -05:00
|
|
|
|
2010-03-07 21:07:42 -05:00
|
|
|
M: declared-effect (literal) known>> (literal) ;
|
2010-03-07 14:44:44 -05:00
|
|
|
|
2009-11-09 01:17:24 -05:00
|
|
|
! Computed values
|
|
|
|
M: f (input-value?) drop f ;
|
|
|
|
|
|
|
|
M: f (literal-value?) drop f ;
|
|
|
|
|
2010-03-07 14:44:44 -05:00
|
|
|
M: f (literal) current-word get bad-macro-input ;
|
|
|
|
|
|
|
|
SYMBOL: (_)
|
|
|
|
ERROR: (@) ;
|
|
|
|
|
|
|
|
GENERIC: known>callable ( known -- quot )
|
|
|
|
|
|
|
|
: ?@ ( x -- y )
|
|
|
|
dup callable? [ drop [ (@) ] ] unless ;
|
|
|
|
|
|
|
|
M: object known>callable drop (_) ;
|
|
|
|
M: literal known>callable value>> ;
|
|
|
|
M: composed known>callable
|
|
|
|
[ quot1>> known known>callable ?@ ] [ quot2>> known known>callable ?@ ] bi
|
|
|
|
append ;
|
|
|
|
M: curried known>callable
|
|
|
|
[ quot>> known known>callable ] [ obj>> known known>callable ] bi
|
|
|
|
prefix ;
|
2010-03-07 19:45:33 -05:00
|
|
|
M: declared-effect known>callable
|
2010-03-07 21:07:42 -05:00
|
|
|
known>> known>callable ;
|
2010-03-07 14:44:44 -05:00
|
|
|
|