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の知識が全然無いので、これを機会にちゃんと覚えようかしら。