我试图弄清楚如何传递可执行文件的位置以作为ppx
OCaml 编译器ocamlc
/的过滤器运行ocamlopt
。
我的问题是,基本上
- ppx 过滤器应该采用什么格式作为输入?
- 预计会产生什么?
- 在
cppo
具体的情况下,您如何配置它以接受所需的格式并发出所需的格式? - 为什么不
cat
作为“身份过滤器”工作并且根本不使用过滤器产生相同的结果?
例如,这是一个简单的 OCaml 程序。
(* foo.ml *)
let hi = ();;
Printf.printf "hi there\n"
使用一个非常简单的过滤器cat
,我们可以看到过滤器期望处理什么样的东西作为输入。
$ ocamlopt -ppx cat foo.ml | cat -v
Caml1999M019M-^DM-^U??^@^@^@^G^@^@^@^A^@^@^@^C^@^@^@^B&foo.m
...
File "foo.ml", line 1:
Error: External preprocessor does not produce a valid file
它看起来像某种二进制格式,也许是 AST 表示?
cppo
,没有配置它的选项,在使用显式文件调用时处理文本 OCaml 源文件。我有点困惑为什么它在以#line
这种方式调用时会发出指令……我相信这些指令对 C 编译器有意义,但对 OCaml 编译器没有意义。
例如:
$ cppo foo.ml
# 1 "foo.ml"
let hi = ();;
Printf.printf "hi there\n"
它在作为过滤器调用时工作,提供<stdin>
行指令的文件名。
$ cat foo.ml | cppo
# 1 "<stdin>"
let hi = ();;
Printf.printf "hi there\n"
阅读--help
for cppo
,没有提及输入和输出格式或类似的参数-ppx
,这有点令人失望。
你应该怎么做才能把所有的碎片缝合在一起?