]> gitweb.factorcode.org Git - factor.git/blob - core/effects/effects.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / core / effects / effects.factor
1 ! Copyright (C) 2006, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel math namespaces sequences strings words assocs
4 combinators ;
5 IN: effects
6
7 TUPLE: effect in out terminated? ;
8
9 : <effect> ( in out -- effect )
10     dup { "*" } sequence= [ drop { } t ] [ f ] if
11     effect boa ;
12
13 : effect-height ( effect -- n )
14     dup effect-out length swap effect-in length - ;
15
16 : effect<= ( eff1 eff2 -- ? )
17     {
18         { [ dup not ] [ t ] }
19         { [ over effect-terminated? ] [ t ] }
20         { [ dup effect-terminated? ] [ f ] }
21         { [ 2dup [ effect-in length ] bi@ > ] [ f ] }
22         { [ 2dup [ effect-height ] bi@ = not ] [ f ] }
23         [ t ]
24     } cond 2nip ;
25
26 GENERIC: (stack-picture) ( obj -- str )
27 M: string (stack-picture) ;
28 M: word (stack-picture) word-name ;
29 M: integer (stack-picture) drop "object" ;
30
31 : stack-picture ( seq -- string )
32     [ [ (stack-picture) % CHAR: \s , ] each ] "" make ;
33
34 : effect>string ( effect -- string )
35     [
36         "( " %
37         dup effect-in stack-picture %
38         "-- " %
39         dup effect-out stack-picture %
40         effect-terminated? [ "* " % ] when
41         ")" %
42     ] "" make ;
43
44 GENERIC: stack-effect ( word -- effect/f )
45
46 M: symbol stack-effect drop 0 1 <effect> ;
47
48 M: word stack-effect
49     { "declared-effect" "inferred-effect" }
50     swap word-props [ at ] curry map [ ] find nip ;
51
52 M: effect clone
53     [ effect-in clone ] keep effect-out clone <effect> ;
54
55 : split-shuffle ( stack shuffle -- stack1 stack2 )
56     effect-in length cut* ;
57
58 : load-shuffle ( stack shuffle -- )
59     effect-in [ set ] 2each ;
60
61 : shuffled-values ( shuffle -- values )
62     effect-out [ get ] map ;
63
64 : shuffle* ( stack shuffle -- newstack )
65     [ [ load-shuffle ] keep shuffled-values ] with-scope ;
66
67 : shuffle ( stack shuffle -- newstack )
68     [ split-shuffle ] keep shuffle* append ;