* camlp5 [#u6668308] - http://pauillac.inria.fr/~ddr/camlp5/ - OCaml 3.09 までの camlp4 が名前をcamlp5と名前を変えて配布されている -- OCaml 3.10 以降の camlp4 はそれまでの camlp4 と全く互換性がないため -- Coq 等で使われている -- 現行の camlp4 は undocumentedな部分が多いため camlp4 の代わりにこちらを使うのがよいかもしれない -- 旧camlp4を使っているレガシーコードを新camlp5に移行するなど ** チュートリアル [#k7553218] - [[古いcamlp4のチュートリアル:http://caml.inria.fr/pub/docs/tutorial-camlp4/index.html]] 和訳も誰かが書いてる - [[Tutorial: How to customize the syntax of OCaml, using Camlp5:http://martin.jambon.free.fr/extend-ocaml-syntax.html]] ** とりあえず使ってみる [#ue166d23] - hello.ml を構文解析して、そのままpretty printする camlp5 pr_o.cmo pa_o.cmo hello.ml -- pr_* は pretty printer, pa_* は パーザ -- *_o は original syntax, *_r は revised syntax ** q_MLast.cmo [#pc10172c] ML構文のquotationを有効にする構文拡張? camlp5 q_MLast.cmo pr_o.cmo pa_o.cmo test.ml * メモ [#o7bebed6] ** パス式の扱いの違いについて [#bf88477f] - 次の2つの場合でパス式C.cの表現が異なる -- C.c x (xへの関数C.cの適用) -- new C.c (クラスC.cのnew) - それぞれ次のようになる: MLast.ExAcc (loc, MLast.ExUid (loc, "F"), MLast.ExLid (loc, "f")) MLast.ExNew (loc, ["C"; "c"]) -- 前者は ExAcc で UidとLidを結合, 後者は string list なぜ? - 他にもあるかも ** 旧camlp4 (3.08) からの移植 [#z1f5bf3e] - どうもocaml 3.08あたりまでのcamlp4は antiquote の $lid: .. $ 内に任意の式を許していたようだ。この性質を使ったコードは camlp5では許されない (もちろん現camlp4でも許されない。) -- $Grammar.Entry.parse Pcaml.expr (Stream.of_string 文字列)$ などとすれば良い --- これを真似した: http://cristal.inria.fr/~ddr/camlp5/doc/htmlc/quot.html#b:Example-without-antiquotation-node -- たとえば expr なら Pcaml.expr, class_expr なら Pcaml.class_expr とする - 同じく3.08あたりのcamlp4と antiquotationの種類が異なるようだ。 inherit $lid: str$ などとすると Parse error: illegal begin of class_expr_eoi と怒られる。 strの内容にもよるが inherit $Grammar.Entry.parse Pcaml.class_expr (Stream.of_string str)$ とするか、 inherit $list: [str]$ とするか、 inherit $Grammar.Entry.parse Pcaml.class_expr (Stream.of_string str)$ とする. とする(''後者はcamlp5 6系でエラー''). - 3.08 ではpr_o.cmoがデフォルトで標準出力に出力したようだがcamlp5はそうではない…ように見える?? -- ファイル名が空と判定されて Fatal error: exception Sys_error(": No such file or directory") と言われて落ちる。 Pcaml.input_file := "-"; とすれば標準出力に出るようになった。 - ここまで調べたことを使って [[O'Jacare:http://www.pps.jussieu.fr/~henry/ojacare/index.en.html]] を camlp5 に移植した。 https://sites.google.com/site/keigoattic/o-jacare-camlp5-patch