问题标签 [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.
ocaml - 如何找到接口,即 OCaml 包提供的功能集?
我需要使用将 OCaml 源文件解析为类型化的 AST,并且我相信 ppx_jane 是完成这项工作的正确包。用opam安装后,还是不知道有什么功能。
这是opam 上 ppx_jane 包的链接。它只告诉基本信息和依赖关系。
虽然我可以在 Github 上搜索以了解其他程序员如何调用此包提供的函数,但我仍然无法获得所有可用函数的详尽列表。
ocaml - 如何将 jbuild 和 ppx_driver 与 ppx_deriving 一起使用
我正在尝试将 jbuilder与ppx_deriving(ppx_deriving_yojson
特别是)一起使用,但现在卡住了一个多小时。我目前的方法是一个jbuild
文件,其中包含以下内容:
但这导致
手动运行生成ppx_driver
的输出为空,所以我显然遗漏了一些东西。_build/.ppx/default/ppx_deriving_yojson+ppx_driver.runner/ppx.exe
-print-transformations
topkg
只需包含ppx_deriving
和ppx_deriving_yojson
作为依赖项,代码就可以很好地构建。
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。
ocaml - 使用 ppx_driver (register_transformation_using_ocaml_current_ast) 进行 AST 转换的任何好的使用示例?
tl;博士我正在尝试使用AST_mapper
and制作源转换二进制文件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_mapper
是Parsetree.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
使用我的转换?
ocaml - OCaml 指定 ppx 可执行文件的路径
我试图弄清楚如何传递可执行文件的位置以作为ppx
OCaml 编译器ocamlc
/的过滤器运行ocamlopt
。
我的问题是,基本上
- ppx 过滤器应该采用什么格式作为输入?
- 预计会产生什么?
- 在
cppo
具体的情况下,您如何配置它以接受所需的格式并发出所需的格式? - 为什么不
cat
作为“身份过滤器”工作并且根本不使用过滤器产生相同的结果?
例如,这是一个简单的 OCaml 程序。
使用一个非常简单的过滤器cat
,我们可以看到过滤器期望处理什么样的东西作为输入。
它看起来像某种二进制格式,也许是 AST 表示?
cppo
,没有配置它的选项,在使用显式文件调用时处理文本 OCaml 源文件。我有点困惑为什么它在以#line
这种方式调用时会发出指令……我相信这些指令对 C 编译器有意义,但对 OCaml 编译器没有意义。
例如:
它在作为过滤器调用时工作,提供<stdin>
行指令的文件名。
阅读--help
for cppo
,没有提及输入和输出格式或类似的参数-ppx
,这有点令人失望。
你应该怎么做才能把所有的碎片缝合在一起?
json - 带有 ppx_deriving_yojson 的 sum 类型变体的自定义 json 生成器
我想生成代表 AST 的 JSON 对象,我正在考虑ppx_deriving_yojson
这样做(更具体地说是to_yojson
部分)。现在,当我想求助于自定义编码时,当然有一些极端情况。如文档中所述,自定义记录字段的表示很容易:
会给我
但是有些地方我想为 sum 类型的变体提供自定义表示,并且to_yojson
此处似乎无法识别该属性:
给我
即默认编码ppx_deriving_yojson
。我是否缺少某些东西,或者根本无法实现我想要的东西?
注意:结果是使用utop
和#require "ppx_deriving_yojson";;
作为第一个命令获得的
ocaml - 什么是 PPX?
在许多使用 ReasonML 的项目中,经常使用首字母缩写词 PPX,但很少解释。
什么是 PPX?
为什么 ReasonML 需要它们?
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”。你能帮我么。我做错了什么(所有,我知道)
ocaml - OCaml - 从另一个模块访问派生函数
如果在 lib 的模块中定义了一条记录,并且它包含deriving
生成函数的注释,那么这些函数如何在另一个模块中使用?
例如,yaml
/ ppx_deriving_yaml
opam 模块包含一个[@@deriving yaml]
. 如果[@@deriving yaml]
应用于记录,则会生成函数,例如{record_name}_to_yaml
将记录转换为 Yaml 数据结构的函数。
例子:[@@deriving yaml]
添加到book
记录时,编译时会生成几个函数,一个是book_to_yaml
.
但是,如果您尝试book_to_yaml
从Books
模块外部访问,则它不可用。
为什么这个功能不可用?它是如何访问的?
我的假设是,这是特定于派生和模块如何工作的东西。