0

I am testing out quotations in Camlp4. My tester.ml program is as follows:

open Camlp4.PreCast;;
let x = <:Cstm< x = 1 + 2 >>;;
let y = <:expr< let y = 1 + 2 >>;;
print_string "done";;

I have tried compiling this in various ways, eg.

ocamlc -pp "camlp4of pa_extend.cmo -loc" -I +camlp4 tester.ml

however the executable produced doesn't print out "done" as expected. How should I compile this file?

4

1 回答 1

3

camlp4 --help说:

-loc <name>      Name of the location variable (default: _loc).

你忘记了 的论点-lococamlc您可以通过's-verbose选项检查此结果。(-verbose找出编译中到底发生了什么真的很方便):

$ ocamlc -verbose -pp "camlp4of pa_extend.cmo -loc" -I +camlp4 tester.ml
+ camlp4of pa_extend.cmo -loc "tester.ml" > /blahblah//ocamlpp2f0635

输入文件名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";;

-printer Camlp4OCamlPrinter您可以使用选项以人类可读的形式检查 CamlP4 的输出。这是使用 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"
于 2016-03-11T02:13:05.937 回答