factor/core/effects/effects.factor

85 lines
2.4 KiB
Factor
Raw Normal View History

! Copyright (C) 2006, 2009 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: kernel math math.parser math.order namespaces make sequences strings
2008-08-11 00:36:46 -04:00
words assocs combinators accessors arrays ;
2007-09-20 18:09:08 -04:00
IN: effects
TUPLE: effect { in read-only } { out read-only } { terminated? read-only } ;
2007-09-20 18:09:08 -04:00
: <effect> ( in out -- effect )
dup { "*" } sequence= [ drop { } t ] [ f ] if
effect boa ;
2007-09-20 18:09:08 -04:00
: effect-height ( effect -- n )
[ out>> length ] [ in>> length ] bi - ; inline
2007-09-20 18:09:08 -04:00
: effect<= ( effect1 effect2 -- ? )
2007-09-20 18:09:08 -04:00
{
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 ]
} cond 2nip ; inline
2007-09-20 18:09:08 -04:00
: effect= ( effect1 effect2 -- ? )
[ [ in>> length ] bi@ = ]
[ [ out>> length ] bi@ = ]
[ [ terminated?>> ] bi@ = ]
2tri and and ;
2008-07-18 20:22:59 -04:00
GENERIC: effect>string ( obj -- str )
M: string effect>string ;
M: object effect>string drop "object" ;
2008-07-18 20:22:59 -04:00
M: word effect>string name>> ;
2008-08-11 00:36:46 -04:00
M: integer effect>string number>string ;
2008-12-03 20:12:48 -05:00
M: pair effect>string first2 [ effect>string ] bi@ ": " glue ;
2007-09-20 18:09:08 -04:00
: stack-picture ( seq -- string )
2008-08-11 03:49:43 -04:00
dup integer? [ "object" <repetition> ] when
2008-07-18 20:22:59 -04:00
[ [ effect>string % CHAR: \s , ] each ] "" make ;
2007-09-20 18:09:08 -04:00
2008-07-18 20:22:59 -04:00
M: effect effect>string ( effect -- string )
2007-09-20 18:09:08 -04:00
[
"( " %
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 )
M: word stack-effect "declared-effect" word-prop ;
2007-09-20 18:09:08 -04:00
M: deferred stack-effect call-next-method (( -- * )) or ;
2007-09-20 18:09:08 -04:00
M: effect clone
[ in>> clone ] [ out>> clone ] bi <effect> ;
2007-09-29 19:43:03 -04:00
2008-07-18 20:22:59 -04:00
: stack-height ( word -- n )
stack-effect effect-height ;
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
: shuffle-mapping ( effect -- mapping )
[ out>> ] [ in>> ] bi [ index ] curry map ;
2007-09-29 19:43:03 -04:00
2008-09-05 21:39:45 -04:00
: shuffle ( stack shuffle -- newstack )
shuffle-mapping swap nths ;
: add-effect-input ( effect -- effect' )
[ in>> "obj" suffix ] [ out>> ] [ terminated?>> ] tri effect boa ;
: compose-effects ( effect1 effect2 -- effect' )
over terminated?>> [
drop
] [
[ [ [ in>> length ] [ out>> length ] bi ] [ in>> length ] bi* swap [-] + ]
[ [ out>> length ] [ [ in>> length ] [ out>> length ] bi ] bi* [ [-] ] dip + ]
[ nip terminated?>> ] 2tri
effect boa
] if ; inline