     } cond 2nip ; inline
 
 : effect= ( effect1 effect2 -- ? )
-    [ [ in>> length ] same? ]
-    [ [ out>> length ] same? ]
-    [ [ terminated?>> ] same? ]
-    2tri and and ;
+    2dup [ in>> length ] same? [
+        2dup [ out>> length ] same? [
+            [ terminated?>> ] same?
+        ] [ 2drop f ] if
+    ] [ 2drop f ] if ;
 
 GENERIC: effect>string ( obj -- str )
 M: string effect>string ;

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

: variable-effect? ( effect -- ? )
    [ in-var>> ] [ out-var>> ] bi or ;

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

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
