海野がはじめて書いた SML プログラムです。信用しないでください(しないか)。
fun maxargs(stm) =
let
fun max(a, b) =
if a > b then a else b
fun maxargs_loop_stm(m, CompoundStm(left, right)) =
max(maxargs_loop_stm(m, left), maxargs_loop_stm(m, right))
| maxargs_loop_stm(m, AssignStm(id, exp)) = maxargs_loop_exp(m, exp)
| maxargs_loop_stm(m, PrintStm(l)) =
max(length l, maxargs_loop_explist(m, l))
and maxargs_loop_exp(m, IdExp(id)) = m
| maxargs_loop_exp(m, NumExp(i)) = m
| maxargs_loop_exp(m, OpExp(lhs, bop, rhs)) =
max(maxargs_loop_exp(m, lhs), maxargs_loop_exp(m, rhs))
| maxargs_loop_exp(m, EseqExp(s, e)) =
max(maxargs_loop_stm(m, s), maxargs_loop_exp(m, e))
and maxargs_loop_explist(m, l) =
if length l > 1 then
max(maxargs_loop_exp(m, hd(l)),
maxargs_loop_explist(m, List.drop(l, 1)))
else
maxargs_loop_exp(m, hd(l))
in
maxargs_loop_stm(0, stm)
end