main

Where

Let main args.
    Let n.
        Match (LIST.fetch args 1)
        | `nothing (OS.die "Expected a number argument.")
        | `just.arg
            Match (Z.read arg)
            | `nothing (OS.die "Expected a number argument.")
            | `just.n n
            ;
        ;
    In
    (STDIO.print_line $ Z.show $ factorial n)

Where

Let factorial n.
    Begin (multiplying 1 2)
        Define multiplying f m.
            If (m > n)
                f
                Goto (multiplying (f * m) (m + 1))

Where

Let LIST. Package "list"
Let OS. Package "os"
Let STDIO. Package "stdio"
Let Z. Package "z"