local fun loop rand = (* 引数として乱数生成器の状態をとる *) let val x = (Random.randNat rand) mod 10 in let val y = (Random.randNat rand) mod 10 in (print (Int.toString x); print " + "; print (Int.toString y); print " = ? "; let val s = valOf (TextIO.inputLine TextIO.stdIn) in let val z = valOf (Int.fromString s) in (print (if x + y = z then "Correct\n" else "Wrong\n"); (* またloopを呼び出す *) loop rand) end end) end end in fun start seed1 seed2 = (* 乱数発生器の種(seed)を受け取る *) (* 乱数生成器を初期化してloopを呼び出す *) loop (Random.rand (seed1, seed2)) end (* 注: let 定義1 in let 定義2 in ... let 定義m in (式1; 式2; ...; 式n) end ... end end という形の式は、 let 定義1 定義2 ... 定義m in 式1; 式2; ...; 式n end と略すことができる。これを用いると、上のプログラムは下のように書ける。 *) (* local fun loop rand = (* 引数として乱数生成器の状態をとる *) let val x = (Random.randNat rand) mod 10 val y = (Random.randNat rand) mod 10 in print (Int.toString x); print " + "; print (Int.toString y); print " = ? "; let val s = valOf (TextIO.inputLine TextIO.stdIn) val z = valOf (Int.fromString s) in print (if x + y = z then "Correct\n" else "Wrong\n"); (* またloopを呼び出す *) loop rand end end in fun start seed1 seed2 = (* 乱数発生器の種(seed)を受け取る *) (* 乱数生成器を初期化してloopを呼び出す *) loop (Random.rand (seed1, seed2)) end *)