首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCaml指定ppx可执行文件的路径

OCaml指定ppx可执行文件的路径
EN

Stack Overflow用户
提问于 2018-03-31 02:41:50
回答 2查看 229关注 0票数 0

我正在试图找出如何传递一个可执行文件的位置,以便作为ppx过滤器运行到OCaml编译器ocamlc/ocamlopt中。

我的问题基本上是

  • ppx过滤器应该采用什么格式作为输入?
  • 预计会产生什么结果?
  • 特别是在cppo的情况下,如何配置它以接受所需的格式并发出所需的格式?
  • 为什么cat不能作为“身份筛选器”使用任何过滤器产生相同的结果?

例如,这里有一个简单的OCaml程序。

代码语言:javascript
复制
(* foo.ml *)
let hi = ();;

Printf.printf "hi there\n"

使用一个非常简单的过滤器cat,我们可以看到过滤器作为输入应该处理什么样的事情。

代码语言:javascript
复制
$ 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编译器没有意义。

例如:

代码语言:javascript
复制
$ cppo foo.ml
# 1 "foo.ml"
let hi = ();;

Printf.printf "hi there\n"

它在作为过滤器调用时工作,为行指令提供<stdin>的文件名。

代码语言:javascript
复制
$ cat foo.ml | cppo
# 1 "<stdin>"
let hi = ();;

Printf.printf "hi there\n"

阅读--help for cppo时,没有提到输入和输出格式,也没有提到像-ppx这样的参数,这有点令人失望。

你该怎么办才能把所有的碎片缝在一起?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-03 21:10:08

Ocaml编译器支持两个不同的预处理器系列:使用-pp选项调用的文本预处理器和用-ppx选项调用的(二进制) AST预处理器。

文本预处理程序需要将文本源文件的名称作为输入,并在stdout上输出OCaml源文件或OCaml二进制文件。对于这些,cat确实实现了标识映射:ocamlc -pp catocamlc。这些预处理器的一个重要限制是它们不能链接在一起。

相反,AST预处理程序将输入-ppx二进制文件的名称和输出二进制AST文件的名称作为输入。换句话说,在这种情况下,标识映射可以用cpocamlc -ppx cpocamlc实现。由于这些预处理器的输入和输出都是二进制AST,所以可以将多个ppx预处理器链接在一起。

cppo预处理程序确实属于第一个系列,需要使用-pp调用。

票数 2
EN

Stack Overflow用户

发布于 2018-03-31 03:08:08

事实证明,我将ppx参数(包括扩展点)与camlp4 (或者可能是camlp5,在那里命名很奇怪,我并不完全理解)混为一谈。

在编译器前面放置camlp4过滤器的正确咒语似乎带有-pp标志。

以下命令都会生成a.out

代码语言:javascript
复制
$ ocamlc foo.ml
$ ocamlc -pp cat foo.ml
$ ocamlc -pp cppo foo.ml

有些令人惊讶的是,即使输出是空的,这也是有效的。

代码语言:javascript
复制
$ ocamlc -pp /usr/bin/true foo.ml

以下命令都不会发出有效的OCaml,也不会产生任何结果

代码语言:javascript
复制
$ ocamlc -pp /usr/bin/false foo.ml
File "foo.ml", line 1:
Error: Error while running external preprocessor
$ ocamlc -pp /usr/bin/rev foo.ml
File "/var/.../ocamlpp27e608", line 1, characters 2-3:
Error: Syntax error
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49583700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档