Block
Match (Z.read (OS.fetch_arg 1))
| 'nothing (OS.die "Expected a number argument.")
| 'just.n
Define (print n)
[n -> Z.show -> STDIO.print_line]
In
Begin
[n -> factorial1 -> print]
[n -> factorial2 -> print]
[n -> factorial3 -> print]
End
;
Where
Define (factorial1 n)
Unfold n
If [n <= 1] 1 [n * (Fold [n - 1])]
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 OS Package "os"
Let STDIO Package "stdio"
Let Z Package "z"