■
http://d.hatena.ne.jp/komamitsu/20091211/1260544597#c1260582912
http://d.hatena.ne.jp/camlspotter/20091212/1260590958
で、with sexpを教えてもらったので試してみました。
TYPE_CONV_PATH "LogicCamlp4" open Sexplib open Sexplib.Sexp type price = Open of float | Top of float | Bottom of float | Close of float with sexp type price_sig = Ge of price | Gt of price | Le of price | Lt of price with sexp type cond = TimeOpen | TimeClose | Price of price_sig with sexp type action = Buy of price | Sell of price with sexp type elm = Conds of cond list | Action of action | Record of cond list * action | Records of (cond list * action) list with sexp let sample = " (((cond (TimeOpen)) (action Buy Open 0)) ((cond (Price Ge Open +1.2) (Price Le Top -0.5)) (action Sell Open +1.2)) ((cond (Price Lt Open -1.5)) (action Sell Open -1.5)) ((cond (TimeClose)) (action Sell Close 0))) " let parsed = elm_of_sexp (scan_sexp (Lexing.from_string sample))
各typeにwith sexpをつけて、type elm = ... with sexp から生成される変換関数 elm_of_sexp で一気にパースしてしまおうという腹です。先頭の一行はコンパイル時に「Failure: "Pa_type_conv: path not set"」と怒られたのでつけています(ちゃんと調べてない…)。
で、コンパイル
$ ocamlfind c -o logic_camlp4 -linkpkg -package sexplib.syntax -syntax camlp4o logic_camlp4.ml
これが通ったので安心していたら
Fatal error: exception Conv.Of_sexp_error("LogicCamlp4.elm_of_sexp: a nested list is an invalid sum", _)
と怒られてしまった。 そう簡単にはいかんのか… あぁ、そもそもcondとかactionとかついてるしそりゃ当然か、後で直そう。
あと、どうもCamlP4の知識が全然無いので、これを機会にちゃんと覚えようかしら。