USING: combinators kernel math ; IN: test : (pow) ( f n -- f' ) [ dup even? ] [ [ sq ] [ 2 /i ] bi* ] while dup 1 = [ drop ] [ dupd 1 - (pow) * ] if ; : pow ( f n -- f' ) { { [ dup 0 < ] [ abs (pow) recip ] } { [ dup 0 = ] [ 2drop 1 ] } [ (pow) ] } cond ;