G'Camlですよ

予想通りにMakefile.ntがまるでメンテされて無くて笑っていいのか泣いていいのかでしたが、とりあえず.ntのつかない方からコピーしてあれこれしてたらhttp://d.hatena.ne.jp/shinichiro_h/20060918#1158547913は動きました。

#load "gcamllib.cma";;

type a = A
type b = B of int

let _ =
  Gprint.eprint "aaaa";
  Gprint.eprint 11;
  Gprint.eprint A;
  Gprint.eprint (B 11);
  Gprint.eprint [1;2];
  Gprint.eprint (Obj.magic (B 1));
  Gprint.eprint Gprint.eprint;
C:\Program Files\gcaml\bin>set OCAMLLIB=C:/progra~1/gcaml/lib

C:\Program Files\gcaml\bin>ocaml e.ml
"aaaa"
11
A
B (11)
[ 1; 2 ]


それはいいのですがcamlp4がなぜかビルドできません。手を加えようにもocamlbuildのシーケンスなので、失敗したら途中のファイルが全部消えてて泣けます。
あと自前でビルドしてもtcl/tkを使うやつはやっぱり動いてくれませんです。わざわざMinGWのtcl/tkの.dll用にインポートライブラリ作り直したりしたのに。
あとlibの探索順が、環境変数OCAMLLIB→環境変数GCAMLLIBなので、無印とG'Camlの使い分けが非常に面倒という……GCAMLLIB先に探すのが正解ですよねこれ。手元ではそうしとこう……。最初Env.Errorって何事かと。無印のlibが参照されてたわけです。.cmiやらに互換性が無いんですね。
メモ。何故かocamlのソースのsedマクロはCRLF改行ですが、MinGWsedではLF改行が必要。
メモのメモ。改行コードはcvsのせいか……。

# #load "gcamllib.cma";;
# Gcaml.typeof 1;;
- : Rtype.type_expr = [: int(*1*) :]
# Gcaml.typeof "abc";;
- : Rtype.type_expr = [: string(*3*) :]
# let is_int x = match Gcaml.typeof x with [: int :] -> true | _ -> false;;
Characters -1--1:
  let is_int x = match Gcaml.typeof x with [: int :] -> true | _ -> false;;

Warning G: rtype is not yet supported in Unused_var.get_vars
val is_int :
  { 'b -> Rtype.type_expr < { 'a } => 'a -> Rtype.type_expr } => 'b -> bool =
  <generic>
# is_int 1;;
- : bool = true
# is_int "x";;
- : bool = false

警告の意味はよくわからんですがとにかく実行時に型が取れてます。

あと稲葉さんの解説見つけた。恐らく世界一わかりやすい資料じゃないでしょうか。そもそもヒット件数が(ry
http://arbre.is.s.u-tokyo.ac.jp/~kinaba/seminars/gcaml/index.ja.html