     [ out>> length ] [ in>> length ] bi - ; inline
 
 : variable-effect? ( effect -- ? )
-    [ in-var>> ] [ out-var>> ] bi or ;
+    dup in-var>> [ drop t ] [ out-var>> ] if ;
 
 : bivariable-effect? ( effect -- ? )
     [ in-var>> ] [ out-var>> ] bi = not ;

    } 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 ;

M: deferred stack-effect call-next-method ( -- * ) or ;

M: effect clone
    (clone) [ clone ] change-in [ clone ] change-out ;

: stack-height ( word -- n )
    stack-effect effect-height ; inline
