MinCamlが例外を吐く

id:sumii先生へ
MinCamlソースeven-odd.mlがコンパイルできない.raiseされた Not_found がcatch*1されないようだ.使っているのはCVS HEAD.
MakefileCFLAGS の後,SOURCES の前辺りに OCAMLFLAGS=-gOCAMLBLDFLAGS=-g を追加したらスタックトレースが出るようになった(私はバイトコードコンパイラを使っている).Virtual.g 内の matchClosure.MakeCls 節内の expand の第一引数内で使っている Map.find から出ている模様.
ちなみにスタックトレースの内容は微妙に怪しくて,あり得ない位置を指し示していたりする.まぁ仕方ないのかもしれないが... Javaはもっと的確に場所を示してくれるよなぁ.例外表を引くときと,例外表を構築するときと,どっちで間違いが生じているんだろう? 関係ないがocamllexの作るlexerは空白文字をそれに引き続くlexemeの一部とみなした列番号を吐くようだ.
さて私にはまだ意味が理解できないが,Not_found を引き起こすよくない入力はこんな感じのもの(自作dumper):

Prog([{name:("odd.21",Fun([Int],Int)),args:[("x.22",Int)],formal_fv:[("even.17",
Fun([Int],Int));("f.16",Int)],body:Let(("Ti9.29",Int),Int(0),IfLE("x.22",
"Ti9.29",Let(("Ti10.32",Int),Int(0),IfLE("Ti10.32","x.22",Var("f.16"),
Let(("Ti11.34",Int),Int(1),Let(("Ti12.33",Int),Add("x.22","Ti11.34"),
AppCls(("even.17",["Ti12.33"]))))),Let(("Ti13.31",Int),Int(1),Let(("Ti14.30",
Int),Sub("x.22","Ti13.31"),AppCls(("even.17",["Ti14.30"])))))};{name:("even.17",
Fun([Int],Int)),args:[("x.18",Int)],formal_fv:[("f.16",Int);("t.15",Int)],body:
MakeCls(("odd.21",Fun([Int],Int)),{entry:"odd.21",actual_fv:["even.17";"f.16"]},
Let(("Ti3.23",Int),Int(0),IfLE("x.18","Ti3.23",Let(("Ti4.26",Int),Int(0),
IfLE("Ti4.26","x.18",Var("t.15"),Let(("Ti5.28",Int),Int(1),Let(("Ti6.27",Int),
Add("x.18","Ti5.28"),AppCls(("odd.21",["Ti6.27"]))))),Let(("Ti7.25",Int),Int(1),
Let(("Ti8.24",Int),Sub("x.18","Ti7.25"),AppCls(("odd.21",["Ti8.24"]))))))}],
Let(("t.15",Int),Int(123),Let(("f.16",Int),Int(456),MakeCls(("even.17",
Fun([Int],Int)),{entry:"even.17",actual_fv:["f.16";"t.15"]},Let(("Ti1.20",Int),
Int(789),Let(("Ti2.19",Int),AppCls(("even.17",["Ti1.20"]),
AppDir(("min_caml_print_int",["Ti2.19"])))))))

改行は元々は1つも入っていない(ぉ

*1:"whenされない" では意味不明だ.後発言語のくせにどうして既存の言語と同じキーワードを使わないのか謎だ.