local open

このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

last mod. 2010-08-05 (木) 14:54:20

OCaml 3.12 で導入された local open 機能を使うと、 open によって導入される識別子のスコープを単一の式に限定することができるようになります。

let open Complex in
  conj (add one i) (* 1-i *)

conj one (* error *)

これが特に便利なのは演算子と組み合わせた場合です。

例えば、 32 ビット整数の計算を行なう場合、 Int32 モジュールを使って Int32.add a b のように書くことができますが、毎回 Int32 と書くのは少し面倒です。かといって、 open Int32 として add や sub といった一般的な名前で現在の名前空間を汚されてしまうのも面白くありません(succ のように Pervasives モジュールの識別子と衝突する名前もあります!)。このような場合は、 int32 型に対する演算子だけを定義したモジュールを定義し、

module Int32Op = struct
  let (~+) (x : int32) = x
  let (~-) = Int32.neg
  let (+) = Int32.add
  let (-) = Int32.sub
  let ( * ) = Int32.mul
  let (/) = Int32.div
  let (mod) = Int32.rem
end

それを local open して使うと、名前空間を汚染せずに簡潔にプログラムを書くことができます。

let open Int32Op in
let a = 2l in
  - a + 3l * 4l

let open と演算子の使用箇所が近いので、短かい演算子を使っても比較的混乱しにくいでしょう。

別の構文を使って、次のように書くこともできます。

let a = 2l in
  Int32Op.(-a + 3l * 4l)

これとは別に Num モジュールのように、他のモジュールと衝突しないような名前で演算子を定義し、大域的に open してそちらを使うという方法もあります。他のモジュールと同時に使う場合や、現在のモジュール全体で使いたい場合にはこちらの方が便利でしょう。文脈に応じて使い分けてみてください。

新規 編集 添付