例外

(* 適当に例外を3つ宣言。楽でいいですね。 *)
# exception E1;;
exception E1
# exception E2;;
exception E2
# exception E3;;
exception E3

(* 例外を発生させるだけの子。 *)
# let foo = function
        | 1 -> raise E1
        | 2 -> raise E2
        | 3 -> raise E3
        | otherwise -> "Lisp !" ;;
val foo : int -> string = <fun>

(* 例外もパターンマッチ! *)
# let bar n =
        try foo n with
                | E1 -> "e1"
                | E2 -> "e2"
                | otherwise -> "??" ;;
val bar : int -> string = <fun>

(* (bar 4)はそもそも例外を発生しないのでtryされない *)
# (bar 1, bar 2, bar 3, bar 4);;
- : string * string * string * string = ("e1", "e2", "??", "Lisp !")


例外とは関係ないけど、letの挙動にまだ慣れることができない。

# let a = 99 in a + 1 ;;
- : int = 100
# a;; (* Error: Unbound value a *)

(* こうしなきゃならない *)
# let a =
  	let b = 999 in b + 1;;
val a : int = 1000
# a;;
- : int = 1000

後者の1行目がlet宣言で、2行目がlet式・・・でいいのかな。
五十嵐先生の本を買ってちゃんと勉強しないと!