问题标签 [ppx]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
87 浏览

ocaml - 如何找到接口,即 OCaml 包提供的功能集?

我需要使用将 OCaml 源文件解析为类型化的 AST,并且我相信 ppx_jane 是完成这项工作的正确包。用opam安装后,还是不知道有什么功能。

这是opam 上 ppx_jane 包的链接。它只告诉基本信息和依赖关系。

虽然我可以在 Github 上搜索以了解其他程序员如何调用此包提供的函数,但我仍然无法获得所有可用函数的详尽列表。

0 投票
1 回答
417 浏览

ocaml - 如何将 jbuild 和 ppx_driver 与 ppx_deriving 一起使用

我正在尝试将 jbuilderppx_derivingppx_deriving_yojson特别是)一起使用,但现在卡住了一个多小时。我目前的方法是一个jbuild文件,其中包含以下内容:

但这导致

手动运行生成ppx_driver的输出为空,所以我显然遗漏了一些东西。_build/.ppx/default/ppx_deriving_yojson+ppx_driver.runner/ppx.exe-print-transformations

topkg只需包含ppx_derivingppx_deriving_yojson作为依赖项,代码就可以很好地构建。

0 投票
1 回答
507 浏览

ocaml - 如何使用 ppx 为数据类型派生 to_string 方法

如何使用 ppx 和jbuilderto_string派生数据类型的方法?

例如,我正在尝试使用为数据类型@@deriving show派生show_*方法。我有一个main.ml看起来像这样的简单文件:

jbuild在同一目录中有一个文件,如下所示:

当我运行时jbuilder build,我收到以下错误:

似乎jbuilder没有运行ppx_deriving.show预处理器,也没有生成show_foo函数。

我的用法@@derive show正确吗?我是否需要在我的jbuild文件中添加一些内容才能使其正常工作?ppx_deriving与 合作有问题吗jbuilder?我应该使用不同的 ppx 库吗?我应该使用不同的构建系统吗?大多数 OCamlers 如何处理这类构建系统问题?


编辑:我使用的是 OCaml 版本 4.04.2、jbuilder 版本 1.0+beta11 和 ppx_deriving 版本 4.1。

0 投票
1 回答
244 浏览

ocaml - 使用 ppx_driver (register_transformation_using_ocaml_current_ast) 进行 AST 转换的任何好的使用示例?

tl;博士我正在尝试使用AST_mapperand制作源转换二进制文件ppx_driver。我不知道如何获取AST_mapper文档中的示例以供ppx_driver. 有没有很好的使用示例Ppx_driver.register_transformation_using_ocaml_current_ast

我正在尝试AST_mapper将文档中的示例移植到与ppx_driver. 具体来说,我希望创建一个以源为输入的二进制文件,使用此测试映射器转换源,然后输出转换后的源。不幸的是,由提供的默认 mainAst_mapper仅接受 Ocaml AST 作为输入(并且可能将其作为输出产生)。这是不可取的,因为我不想通过运行它ocamlc-dsource获得我的输出。

这是我最好的移植方法:

test_mapper.ml

需要注意的几点:

  • 文档中的示例不能开箱即用(在引入之前ppx_driver):Const_int 42必须替换为Ast_helper.Const.int 42
  • 出于某种原因test_mapperParsetree.structure -> mapper。(我不清楚为什么递归转换需要结构来创建映射器,但没关系。)但是,这种类型不是Ppx_driver.register_transformation_using_ocaml_current_ast预期的。所以我写了一个草率的包装器test_transformation来让类型检查器开心(这是松散地基于如何Ast_mapper.apply_lazy将映射器应用于 AST,所以理论上它应该可以工作)

不幸的是,在将其编译成二进制文件后:

并在示例文件上运行它:

样本.ml

具有以下内容:

我没有看到任何转换发生(示例文件逐字反刍)。更重要的是,我在代码中留下的日志Pprintast.expression没有打印任何内容,这表明我的映射器从不访问任何内容。

我能够在野外找到的所有示例都是由 Jane Street(谁写的)开源的,ppx_*并且似乎没有记录它们的转换(也许有一些神奇的检测正在发生在我的脑海中)或者如果他们这样做了他们使用Ppx_driver.register_transformation ~rules哪些用途Ppx_core.ContextFree(这似乎并不完整,并且不适用于我的实际用例 - 但出于这个问题的目的,我试图让事情普遍适用)。

有没有很好的例子说明如何正确地做到这一点?为什么不ppx_driver使用我的转换?

0 投票
2 回答
197 浏览

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

我试图弄清楚如何传递可执行文件的位置以作为ppxOCaml 编译器ocamlc/的过滤器运行ocamlopt

我的问题是,基本上

  • ppx 过滤器应该采用什么格式作为输入?
  • 预计会产生什么?
  • cppo具体的情况下,您如何配置它以接受所需的格式并发出所需的格式?
  • 为什么不cat作为“身份过滤器”工作并且根本不使用过滤器产生相同的结果?

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

使用一个非常简单的过滤器cat,我们可以看到过滤器期望处理什么样的东西作为输入。

它看起来像某种二进制格式,也许是 AST 表示?

cppo,没有配置它的选项,在使用显式文件调用时处理文本 OCaml 源文件。我有点困惑为什么它在以#line这种方式调用时会发出指令……我相信这些指令对 C 编译器有意义,但对 OCaml 编译器没有意义。

例如:

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

阅读--helpfor cppo,没有提及输入和输出格式或类似的参数-ppx,这有点令人失望。

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

0 投票
1 回答
130 浏览

ocaml - 处理graphql结果时出现类型错误

我刚开始使用 reasonML 和 graphql,并构建了一个简单的反应组件,用于从世界杯 API 检索数据。我的代码如下:

匹配组件

但我收到了这个错误:

我添加了 Js.log(response##matches); 并在控制台中得到了这个
js.log

0 投票
1 回答
60 浏览

json - 带有 ppx_deriving_yojson 的 sum 类型变体的自定义 json 生成器

我想生成代表 AST 的 JSON 对象,我正在考虑ppx_deriving_yojson这样做(更具体地说是to_yojson部分)。现在,当我想求助于自定义编码时,当然有一些极端情况。如文档中所述,自定义记录字段的表示很容易:

会给我

但是有些地方我想为 sum 类型的变体提供自定义表示,并且to_yojson此处似乎无法识别该属性:

给我

即默认编码ppx_deriving_yojson。我是否缺少某些东西,或者根本无法实现我想要的东西?

注意:结果是使用utop#require "ppx_deriving_yojson";;作为第一个命令获得的

0 投票
2 回答
135 浏览

ocaml - 什么是 PPX?

在许多使用 ReasonML 的项目中,经常使用首字母缩写词 PPX,但很少解释。

什么是 PPX?

为什么 ReasonML 需要它们?

0 投票
1 回答
430 浏览

ocaml - 如何编写自定义 ppx 装饰器来重写?

我需要生成一个与我传递的类型不同类型的值。这是我第一次写类似 ocaml 的东西,例如,在我熟悉的 haskell 中,我会使用 Data.Generics。我如何理解我需要使用装饰器和ppx。我写了简单的例子

但是在脚本代码中使用

我抓到:

不支持架构

. 当我将@deriving(my_schema) 更改为@deriving(abcd) 和@deriving(sschema) 时,我确保自己正确连接它。我得到了不同的错误

Ppxlib.Deriving:“abcd”不是受支持的类型派生生成器。

我的最后一个实验是复制过去现有的库派生访问器。 ppx_accessor 我复制粘贴它并为 accessors_2 重命名。我得到了同样的错误,比如实验。

不支持 accessors_2

另外我还没有找到示例“ppx rescript”。你能帮我么。我做错了什么(所有,我知道)

0 投票
1 回答
42 浏览

ocaml - OCaml - 从另一个模块访问派生函数

如果在 lib 的模块中定义了一条记录,并且它包含deriving生成函数的注释,那么这些函数如何在另一个模块中使用?

例如,yaml/ ppx_deriving_yamlopam 模块包含一个[@@deriving yaml]. 如果[@@deriving yaml]应用于记录,则会生成函数,例如{record_name}_to_yaml将记录转换为 Yaml 数据结构的函数。

例子:[@@deriving yaml]添加到book记录时,编译时会生成几个函数,一个是book_to_yaml.

但是,如果您尝试book_to_yamlBooks模块外部访问,则它不可用。

为什么这个功能不可用?它是如何访问的?

我的假设是,这是特定于派生和模块如何工作的东西。