camlp4 --help
говорит:
-loc <name> Name of the location variable (default: _loc).
Вы забыли аргумент для -loc
. Вы можете проверить это последствие на ocamlc
-verbose
. (-verbose
действительно удобно, чтобы выяснить, какие именно происходит в компиляции): имя файла tester.ml
$ ocamlc -verbose -pp "camlp4of pa_extend.cmo -loc" -I +camlp4 tester.ml
+ camlp4of pa_extend.cmo -loc "tester.ml" > /blahblah//ocamlpp2f0635
вход не рассматривается как имя файла, но рассматривается как имя переменных местоположения. С пустым вводом camlp4of
выводит пустую программу и скомпилируется ocamlc
. Вот почему окончательный исполняемый файл ничего не делает.
В коде содержится странное котировочное имя Cstrm
, а let y = 1 + 2
- не выражение, а элемент структуры. Ниже приведен один из ближайших кодов, компилировать:
(* compilable by ocamlc -pp "camlp4of pa_extend.cmo" -I +camlp4 tester.ml *)
open Camlp4.PreCast;;
let x _loc = <:expr< x = 1 + 2 >>;;
let y _loc = <:str_item< let y = 1 + 2 >>;;
print_string "done";;
Вы можете проверить выход CamlP4 в читаемом виде с -printer Camlp4OCamlPrinter
опцией. Это еще один важный метод работы с CamlP4:
$ camlp4of pa_extend.cmo -printer Camlp4OCamlPrinter tester.ml
open Camlp4.PreCast
let x _loc =
Ast.ExApp (_loc,
(Ast.ExApp (_loc, (Ast.ExId (_loc, (Ast.IdLid (_loc, "=")))),
(Ast.ExId (_loc, (Ast.IdLid (_loc, "x")))))),
(Ast.ExApp (_loc,
(Ast.ExApp (_loc, (Ast.ExId (_loc, (Ast.IdLid (_loc, "+")))),
(Ast.ExInt (_loc, "1")))),
(Ast.ExInt (_loc, "2")))))
let y _loc =
Ast.StVal (_loc, Ast.ReNil,
(Ast.BiEq (_loc, (Ast.PaId (_loc, (Ast.IdLid (_loc, "y")))),
(Ast.ExApp (_loc,
(Ast.ExApp (_loc, (Ast.ExId (_loc, (Ast.IdLid (_loc, "+")))),
(Ast.ExInt (_loc, "1")))),
(Ast.ExInt (_loc, "2")))))))
let _ = print_string "done"