val NL = implode [#"newline"] fun itone 1 = "it" | n = "one" fun plural (s, 0) = ("no " @ s @ "s") | (s, 1) = ("1 " @ s) | (s, n) = (ntos n @ " " @ s @ "s") fun verse 0 = "no bottles of beer on the wall" @ NL @ "no bottles of beer" @ NL @ "go to the store and buy some more" @ NL @ "99 bottles of beer on the wall" @ NL @ NL | x = plural ("bottle",x) @ " of beer on the wall" @ NL @ plural ("bottle",x) @ " of beer" @ NL @ "take " @ (itone x) @ " down and pass it round" @ NL @ plural ("bottle", (x-1)) @ " of beer on the wall" @ NL @ NL fun bottles x = map (print o verse) (rev (0 :: iota (1, x))) fun default (false, y) = y | (x, _) = x ; bottles (ston (default (argv 0, "99")))This code allows one to specify how many bottles on the command line (e.g.
mlite -f 99bob.m 4), defaulting to the usual 99.
© Copyright Bruce M. Axtens, 2014