:: linrec ( if-quot: ( -- ? ) then-quot: ( -- ) else1-quot: ( -- ) else2-quot: ( -- ) -- ) if-quot call [ then-quot call ] [ else1-quot call if-quot then-quot else1-quot else2-quot linrec else2-quot call ] if ; inline recursive :: unfold ( seed p: ( seed -- ? ) f: ( seed -- o ) g: ( seed -- seed' ) -- ) [ seed [ dup p call ] [ ] [ dup f call , g call ] [ ] linrec ] { } make nip ; inline