1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs fry kernel namespaces quotations
4 sequences stack-checker.errors stack-checker.recursive-state ;
5 IN: stack-checker.values
7 : <value> ( -- value ) \ <value> counter ;
11 : known ( value -- known )
14 : set-known ( known value -- )
15 '[ _ known-values get set-at ] when* ;
17 : make-known ( known -- value )
18 <value> [ set-known ] keep ;
20 : copy-value ( value -- value' )
23 : copy-values ( values -- values' )
26 GENERIC: (literal-value?) ( value -- ? )
28 : literal-value? ( value -- ? )
29 known (literal-value?) ;
31 GENERIC: (input-value?) ( value -- ? )
33 : input-value? ( value -- ? )
34 known (input-value?) ;
36 GENERIC: (literal) ( known -- literal )
38 TUPLE: literal-tuple < identity-tuple value recursion ;
40 : literal ( value -- literal ) known (literal) ;
42 M: literal-tuple hashcode* nip value>> identity-hashcode ;
44 : <literal> ( obj -- value )
45 recursive-state get literal-tuple boa ;
47 M: literal-tuple (input-value?) drop f ;
49 M: literal-tuple (literal-value?) drop t ;
51 M: literal-tuple (literal) ;
53 : curried/composed-literal ( input1 input2 quot -- literal )
54 [ [ literal ] bi@ ] dip
55 [ [ [ value>> ] bi@ ] dip call ] [ drop nip recursion>> ] 3bi
56 literal-tuple boa ; inline
58 TUPLE: curried-effect obj quot ;
60 C: <curried-effect> curried-effect
62 : >curried-effect< ( curried-effect -- obj quot )
63 [ obj>> ] [ quot>> ] bi ; inline
65 M: curried-effect (input-value?)
66 >curried-effect< [ input-value? ] either? ;
68 M: curried-effect (literal-value?)
69 >curried-effect< [ literal-value? ] both? ;
71 M: curried-effect (literal)
72 >curried-effect< [ curry ] curried/composed-literal ;
74 TUPLE: composed-effect quot1 quot2 ;
76 C: <composed-effect> composed-effect
78 : >composed-effect< ( composed-effect -- quot1 quot2 )
79 [ quot1>> ] [ quot2>> ] bi ; inline
81 M: composed-effect (input-value?)
82 >composed-effect< [ input-value? ] either? ;
84 M: composed-effect (literal-value?)
85 >composed-effect< [ literal-value? ] both? ;
87 M: composed-effect (literal)
88 >composed-effect< [ compose ] curried/composed-literal ;
90 SINGLETON: input-parameter
94 M: input-parameter (input-value?) drop t ;
96 M: input-parameter (literal-value?) drop f ;
98 M: input-parameter (literal) current-word get unknown-macro-input ;
100 ! Argument corresponding to polymorphic declared input of inline combinator
102 TUPLE: declared-effect known word effect variables branches actual ;
104 C: (declared-effect) declared-effect
106 : <declared-effect> ( known word effect variables branches -- declared-effect )
107 f (declared-effect) ; inline
109 M: declared-effect (input-value?) known>> (input-value?) ;
111 M: declared-effect (literal-value?) known>> (literal-value?) ;
113 M: declared-effect (literal) known>> (literal) ;
116 M: f (input-value?) drop f ;
118 M: f (literal-value?) drop f ;
120 M: f (literal) current-word get bad-macro-input ;
122 GENERIC: known>callable ( known -- quot )
125 dup callable? [ drop \ _ ] unless ;
127 M: object known>callable drop \ _ ;
129 M: literal-tuple known>callable value>> ;
131 M: composed-effect known>callable
132 >composed-effect< [ known known>callable ?@ ] bi@ append ;
134 M: curried-effect known>callable
135 >curried-effect< [ known known>callable ] bi@ swap prefix ;
137 M: declared-effect known>callable
138 known>> known>callable ;