Ocaml 如何使用Camlp4编译?

Ocaml 如何使用Camlp4编译?,ocaml,camlp4,Ocaml,Camlp4,我正在测试Camlp4中的报价。我的tester.ml程序如下所示: open Camlp4.PreCast;; let x = <:Cstm< x = 1 + 2 >>;; let y = <:expr< let y = 1 + 2 >>;; print_string "done";; 但是,生成的可执行文件并没有按预期打印“完成”。我应该如何编译此文件?camlp4--help说明: -loc <name> Name o

我正在测试Camlp4中的报价。我的tester.ml程序如下所示:

open Camlp4.PreCast;;
let x = <:Cstm< x = 1 + 2 >>;;
let y = <:expr< let y = 1 + 2 >>;;
print_string "done";;
但是,生成的可执行文件并没有按预期打印“完成”。我应该如何编译此文件?

camlp4--help
说明:

-loc <name>      Name of the location variable (default: _loc).
输入文件名
tester.ml
不被视为文件名,而是被视为位置变量的名称。使用空输入
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--help
说明:

-loc <name>      Name of the location variable (default: _loc).
输入文件名
tester.ml
不被视为文件名,而是被视为位置变量的名称。使用空输入
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";;
$ 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"