MinCamlが例外を吐く
id:sumii先生へ
MinCamlソースeven-odd.mlがコンパイルできない.raiseされた Not_found
がcatch*1されないようだ.使っているのはCVS HEAD.
Makefileの CFLAGS
の後,SOURCES
の前辺りに OCAMLFLAGS=-g
と OCAMLBLDFLAGS=-g
を追加したらスタックトレースが出るようになった(私はバイトコード・コンパイラを使っている).Virtual.g
内の match
の Closure.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されない" では意味不明だ.後発言語のくせにどうして既存の言語と同じキーワードを使わないのか謎だ.