loop : Int Int -- Int
     =: [ swap dup 0 =
          if( drop
            , dup 1 - dip(*) swap loop )
        ]

; tail recursive factorial
;
; see C example: https://wiki.c2.com/?TailRecursion
fac_tailrec : Int -- Int
            =: [ 1 loop ]

; naïve factorial
fac : Int -- Int
    =: [ dup 0 =
         if( drop 1
           , dup 1 - fac * )
       ]

%foreign cabi fac
%foreign cabi fac_tailrec