1 ! Copyright (C) 2006, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel math math.parser math.order namespaces make sequences strings
4 words assocs combinators accessors arrays quotations ;
9 { out array read-only }
10 { terminated? read-only } ;
12 : <effect> ( in out -- effect )
13 dup { "*" } = [ drop { } t ] [ f ] if
16 : effect-height ( effect -- n )
17 [ out>> length ] [ in>> length ] bi - ; inline
19 : effect<= ( effect1 effect2 -- ? )
21 { [ over terminated?>> ] [ t ] }
22 { [ dup terminated?>> ] [ f ] }
23 { [ 2dup [ in>> length ] bi@ > ] [ f ] }
24 { [ 2dup [ effect-height ] bi@ = not ] [ f ] }
28 : effect= ( effect1 effect2 -- ? )
29 [ [ in>> length ] bi@ = ]
30 [ [ out>> length ] bi@ = ]
31 [ [ terminated?>> ] bi@ = ]
34 GENERIC: effect>string ( obj -- str )
35 M: string effect>string ;
36 M: object effect>string drop "object" ;
37 M: word effect>string name>> ;
38 M: integer effect>string number>string ;
39 M: pair effect>string first2 [ effect>string ] bi@ ": " glue ;
41 : stack-picture ( seq -- string )
42 [ [ effect>string % CHAR: \s , ] each ] "" make ;
44 M: effect effect>string ( effect -- string )
47 [ in>> stack-picture % "-- " % ]
48 [ out>> stack-picture % ]
49 [ terminated?>> [ "* " % ] when ]
54 GENERIC: effect>type ( obj -- type )
55 M: object effect>type drop object ;
57 M: pair effect>type second effect>type ;
59 : effect-in-types ( effect -- input-types )
60 in>> [ effect>type ] map ;
62 : effect-out-types ( effect -- input-types )
63 out>> [ effect>type ] map ;
65 GENERIC: stack-effect ( word -- effect/f )
67 M: word stack-effect "declared-effect" word-prop ;
69 M: deferred stack-effect call-next-method (( -- * )) or ;
72 [ in>> clone ] [ out>> clone ] bi <effect> ;
74 : stack-height ( word -- n )
75 stack-effect effect-height ;
77 : split-shuffle ( stack shuffle -- stack1 stack2 )
80 : shuffle-mapping ( effect -- mapping )
81 [ out>> ] [ in>> ] bi [ index ] curry map ;
83 : shuffle ( stack shuffle -- newstack )
84 shuffle-mapping swap nths ;
86 : add-effect-input ( effect -- effect' )
87 [ in>> "obj" suffix ] [ out>> ] [ terminated?>> ] tri effect boa ;
89 : compose-effects ( effect1 effect2 -- effect' )
93 [ [ [ in>> length ] [ out>> length ] bi ] [ in>> length ] bi* swap [-] + ]
94 [ [ out>> length ] [ [ in>> length ] [ out>> length ] bi ] bi* [ [-] ] dip + ]
95 [ nip terminated?>> ] 2tri
96 [ [ "x" <array> ] bi@ ] dip