Block Let arg (OS.fetch_arg 1) In (MAIN.run Match (Z.read arg) | 'nothing (MAIN.die "Expected a number argument.") | 'just.n (MAIN.sequence3 (MAIN.print_line (Z.show (factorial1 n))) (MAIN.print_line (Z.show (factorial2 n))) (MAIN.print_line (Z.show (factorial3 n)))) ;) Where Define (factorial1 n) Define (rec rec n) If [n <= 1] 1 [n * (rec rec [n - 1])] In (rec rec n) Define (factorial2 n) Iterate {f m} From {1 2} If [m > n] f Continue {[f * m] [m + 1]} Define (factorial3 n) (Z.fold n 1 Func {m mfact} [[m + 1] * mfact]) Where Let LIST Package "list" Let MAIN Package "main" Let MAYBE Package "maybe" Let OS Package "os" Let Z Package "z"