标签: ppx

使用ppx和扩展点为OCaml中的DSL编写解析器

最近,它在OCaml官方github中宣布Camlp4ppx rewriters and extension points(https://github.com/ocaml/camlp4)取代:

Camlp4是官方OCaml发行版的一部分,直到版本4.01.0.从那以后,它被一个更简单的系统所取代,这个系统更易于维护和学习:ppx重写器和扩展点.

我一直在使用Camlp4为DSL编写解析器(从OCaml分离语法).

所以,我想问一下这个ppx rewriters工具是否可以做同样的事情?

感谢您花时间阅读我的问题!

ocaml camlp4 ppx

9
推荐指数
1
解决办法
583
查看次数

使用 ppxlib 生成 AST 时如何处理不同的 OCaml 版本

我正在制作一个 ppx 扩展重写器作为代码库的一部分

理想情况下,该库可与某些 OCaml 版本一起使用

我注意到,当构建 AST 节点以从我的重写器输出时,不可避免地必须构造一些记录,其结构特定于特定的 OCaml AST 版本

例如,在构建变体类型声明时,我们必须定义如下记录:

    {
      pcd_name = {txt = name; loc};
      pcd_args = Pcstr_tuple [];
      pcd_res = None;
      pcd_loc = loc;
      pcd_attributes = [];
    }
Run Code Online (Sandbox Code Playgroud)

是哪一种constructor_declaration类型

然而,这种 AST 类型在OCaml 4.13OCaml 4.14之间有所不同

我希望大多数 ppxlibAst_builder帮助程序能够为我正在编译库的任何 OCaml 版本生成正确的 AST 版本。

但在我必须手动定义这些记录实例之一的地方,我可能需要检测当前的 OCaml 版本并以这种方式返回正确的记录格式?

我找到了这个:

utop # Sys.ocaml_version;;
- : string = "4.12.1"
Run Code Online (Sandbox Code Playgroud)

所以想必我应该解析这个字符串,int * int * int以便我可以对 4.14.0 之后的版本进行安全比较

有没有更好的方法,或者我应该做一些不同的事情?

ocaml ppx

5
推荐指数
1
解决办法
70
查看次数

是否可以创建一个在 OCaml 中从左到右计算参数的运算符

当您定义一个运算符时,例如

let (++) a b = a :: b 
Run Code Online (Sandbox Code Playgroud)

当你这样做时

let v = foo a ++ bar b 
Run Code Online (Sandbox Code Playgroud)

bar 在 foo 之前评估。解决方法是使用 let 表达式,即

let e1 = foo a in let e2 = bar b in e1 ++ e2
Run Code Online (Sandbox Code Playgroud)

然而,有时定义一个运算符会很方便,例如它总是从左到右进行计算。有没有办法在 OCaml 中或使用 ppx 或 with 来做到这一点lazy

evaluation ocaml operators lazy-sequences ppx

5
推荐指数
1
解决办法
123
查看次数

标签 统计

ocaml ×3

ppx ×3

camlp4 ×1

evaluation ×1

lazy-sequences ×1

operators ×1