« x86最萌え | Main | caml.inria.fr is down »

December 17, 2004

OCaml:微妙なところ

土曜の午前中に起きるとは大変よいことだ。

Y氏の日記に反応。乗算の演算子 * を前置にしたときにコメントと区別するためにスペースを入れないといけないというのはまあ構文上のお約束で仕方ない気がする。C++にもtemplateをネストして使うときに似たような制限があるし。例:std::vector<std::vector<int> >

むしろ俺が気になって仕方がないのはrecord型のフィールド名(と呼ぶのだろうか?)が事実上モジュール内でグローバルになってしまうということだ。

どういうことかというと、
type record1 = {hoge: int; fuga: int; fugo: int}

type record2 = {hoge: int; foo: int; bar: int}
のような、同じフィールド名を持つrecord型は使えないということだ。型定義だけなら通るものの、実際コード中で
let t = {hoge = 0; fuga = 0; fugo = 0}
と書くと「The record field label fuga belongs to the type record1 but is here mixed with labels of type record2」とエラーになる。つまりhogeというフィールド名はモジュール内でグローバルであり、最後に定義された型record2に属するものとして認識されるらしい。

ちなみに
let t : record1 = {hoge = 0; fuga = 0; fugo = 0};;
として型を明示してもだめ。

まあ「そういう仕様」であって、C++のstructやclassのように使えなかったからといって文句を言うことはできないんだろうけど、名前空間が不当に汚染される気がして窮屈だな…。OCaml標準ライブラリを見ると、基本的にフィールド名は
type record1 = {rec1_hoge: int; rec1_fuga: int; rec1_fugo: int}
のように型を識別するprefixをつけて宣言するものらしいが……なんだかな。

ちなみに上記のコードがmodule Hogeにあるとして、他のモジュールから(open宣言を使用しないで)type record1のデータを参照するには、
t.Hoge.rec1_hoge
のように書くと認識される。この書き方から見ても「名前rec1_hogeはmodule Hogeに属する」という香りがぷんぷんするな…。諦めるしかないのか。

|

« x86最萌え | Main | caml.inria.fr is down »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference OCaml:微妙なところ:

« x86最萌え | Main | caml.inria.fr is down »