2011年4月3日日曜日

Object Oriented OCaml

引きつづきOCaml。OCamlのObject Orientedな部分の仕様が思ってたより膨大で、Thriftが生成したコードが理解できないのでOreillyの本を読みつつサンプルを書いてみる。

oo.ml

class car (name, color)=
  object
      val mutable m_name = name
      val mutable m_color = color
      method get_name = m_name
      method get_color = m_color
      method to_string = m_color ^ " " ^ m_name
  end;;

class flying_car(name, color, flying) =
  object
      inherit car(name, color)
      val mutable m_flying = flying
      method land_car = m_flying <- false
      method fly_car = m_flying <- true
      method to_string =
        let state = if m_flying then "flying" else "not flying" in
        state ^ " " ^ m_color ^ " " ^ m_name
  end;;

let c = new flying_car("Keitora", "black", true) in
let () = c#land_car in
let msg = "I bought a new " ^ c#to_string in
print_endline msg

出力

$ ocamlc oo.ml
$ ./a.out
I bought a new not flying black Keitora

しかしOOな仕様が入ると途端に予約語が増える。ちなみに、最初は関数land_carをlandって名前にしてて謎のコンパイルエラーが発生してた。結局原因はlandという名前の組込み演算子が存在するから。syntax errorってだけじゃなかなか気付かないッスよコンパイラさん。

0 件のコメント:

コメントを投稿