 M: deferred stack-effect call-next-method ( -- * ) or ;
 
 M: effect clone
-    {
-        [ in>> clone ]
-        [ out>> clone ]
-        [ terminated?>> ]
-        [ in-var>> ]
-        [ out-var>> ]
-    } cleave effect boa ;
+    (clone) [ clone ] change-in [ clone ] change-out ;
 
 : stack-height ( word -- n )
     stack-effect effect-height ; inline

    } cond 2nip ; inline

: effect= ( effect1 effect2 -- ? )
    [ [ in>> length ] same? ]
    [ [ out>> length ] same? ]
    [ [ terminated?>> ] same? ]
    2tri and and ;

GENERIC: effect>string ( obj -- str )
M: string effect>string ;

    [ out>> length ] [ in>> length ] bi - ; inline

: variable-effect? ( effect -- ? )
    dup in-var>> [ drop t ] [ out-var>> ] if ;

: bivariable-effect? ( effect -- ? )
    [ in-var>> ] [ out-var>> ] bi = not ;
