2008-02-04 20:38:31 -05:00
|
|
|
! Copyright (C) 2006, 2008 Slava Pestov.
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
USING: kernel math namespaces sequences strings words assocs
|
2008-06-08 16:32:55 -04:00
|
|
|
combinators accessors ;
|
2007-09-20 18:09:08 -04:00
|
|
|
IN: effects
|
|
|
|
|
|
|
|
TUPLE: effect in out terminated? ;
|
|
|
|
|
|
|
|
: <effect> ( in out -- effect )
|
|
|
|
dup { "*" } sequence= [ drop { } t ] [ f ] if
|
2008-04-13 16:06:09 -04:00
|
|
|
effect boa ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: effect-height ( effect -- n )
|
2008-06-08 16:32:55 -04:00
|
|
|
[ out>> length ] [ in>> length ] bi - ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: effect<= ( eff1 eff2 -- ? )
|
|
|
|
{
|
2008-06-08 16:32:55 -04:00
|
|
|
{ [ over terminated?>> ] [ t ] }
|
|
|
|
{ [ dup terminated?>> ] [ f ] }
|
|
|
|
{ [ 2dup [ in>> length ] bi@ > ] [ f ] }
|
2008-03-29 21:36:58 -04:00
|
|
|
{ [ 2dup [ effect-height ] bi@ = not ] [ f ] }
|
2008-04-11 13:53:22 -04:00
|
|
|
[ t ]
|
2007-09-20 18:09:08 -04:00
|
|
|
} cond 2nip ;
|
|
|
|
|
|
|
|
GENERIC: (stack-picture) ( obj -- str )
|
|
|
|
M: string (stack-picture) ;
|
2008-06-28 03:36:20 -04:00
|
|
|
M: word (stack-picture) name>> ;
|
2007-09-20 18:09:08 -04:00
|
|
|
M: integer (stack-picture) drop "object" ;
|
|
|
|
|
|
|
|
: stack-picture ( seq -- string )
|
|
|
|
[ [ (stack-picture) % CHAR: \s , ] each ] "" make ;
|
|
|
|
|
|
|
|
: effect>string ( effect -- string )
|
|
|
|
[
|
|
|
|
"( " %
|
2008-06-08 16:32:55 -04:00
|
|
|
[ in>> stack-picture % "-- " % ]
|
|
|
|
[ out>> stack-picture % ]
|
|
|
|
[ terminated?>> [ "* " % ] when ]
|
|
|
|
tri
|
2007-09-20 18:09:08 -04:00
|
|
|
")" %
|
|
|
|
] "" make ;
|
|
|
|
|
2008-02-04 20:38:31 -05:00
|
|
|
GENERIC: stack-effect ( word -- effect/f )
|
|
|
|
|
2008-06-26 21:47:36 -04:00
|
|
|
M: symbol stack-effect drop (( -- symbol )) ;
|
2008-02-04 20:38:31 -05:00
|
|
|
|
|
|
|
M: word stack-effect
|
|
|
|
{ "declared-effect" "inferred-effect" }
|
2008-06-28 03:36:20 -04:00
|
|
|
swap props>> [ at ] curry map [ ] find nip ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
M: effect clone
|
2008-06-26 21:47:36 -04:00
|
|
|
[ in>> clone ] [ out>> clone ] bi <effect> ;
|
2007-09-29 19:43:03 -04:00
|
|
|
|
|
|
|
: split-shuffle ( stack shuffle -- stack1 stack2 )
|
2008-06-08 16:32:55 -04:00
|
|
|
in>> length cut* ;
|
2007-09-29 19:43:03 -04:00
|
|
|
|
|
|
|
: load-shuffle ( stack shuffle -- )
|
2008-06-08 16:32:55 -04:00
|
|
|
in>> [ set ] 2each ;
|
2007-09-29 19:43:03 -04:00
|
|
|
|
|
|
|
: shuffled-values ( shuffle -- values )
|
2008-06-08 16:32:55 -04:00
|
|
|
out>> [ get ] map ;
|
2007-09-29 19:43:03 -04:00
|
|
|
|
|
|
|
: shuffle* ( stack shuffle -- newstack )
|
|
|
|
[ [ load-shuffle ] keep shuffled-values ] with-scope ;
|
|
|
|
|
|
|
|
: shuffle ( stack shuffle -- newstack )
|
|
|
|
[ split-shuffle ] keep shuffle* append ;
|