:: (unfold) ( seed p: ( seed -- ? ) f: ( seed -- o ) g: ( seed -- seed' ) -- ) seed p call [ seed f call , seed g call p f g (unfold) ] unless ; inline recursive : unfold ( seed p f g -- seq ) [ (unfold) ] { } make ; inline ! fib { 0 1 } [ first 30 > ] [ first ] [ first2 swap over + 2array ] unfold ! fac 100000 [ 1 < ] [ ] [ 1 - ] unfold 1 [ * ] reduce