gpt4 book ai didi

OCaml AST 记录类型表示

转载 作者:行者123 更新时间:2023-12-02 06:09:01 26 4
gpt4 key购买 nike

我正在尝试了解有关 OCaml 扩展点的更多信息,但在遵循 AST 中记录类型的表示时遇到困难。

我从这篇博文中窃取了以下示例:

http://whitequark.org/blog/2014/04/16/a-guide-to-extension-points-in-ocaml/

使用源文件(foo.ml):

 let _ = [%getenv "USER"]

ocamlc -dparsetreefoo.ml 的输出:

 [
structure_item (test.ml[1,0+0]..[1,0+24])
Pstr_eval
expression (test.ml[1,0+8]..[1,0+24])
Pexp_extension "getenv"
[
structure_item (test.ml[1,0+17]..[1,0+23])
Pstr_eval
expression (test.ml[1,0+17]..[1,0+23])
Pexp_constant Const_string("USER",None)
]
]

从asttypes.mli和parsetree.mli我可以遵循该行的解析树模式匹配

 Pexp_constant Const_string("USER",None)

但是,我无法再跟踪解析树表示记录类型时发生的情况。记录字段的表示顺序似乎与类型定义中出现的顺序不同,并且解析树中并非所有字段都是必需的(或显示的)。

来自 parsetree.mli:

 type expression = {
pexp_desc: expression_desc;
pexp_loc: Location.t;
pexp_attributes: attributes;
}

解析树输出似乎只显示位置和有效负载,但我可能读错了。

如何正确读取记录类型的 AST?对于类型表达式应该是:

 (* record type declaration and pexp_loc field *)
expression (test.ml[1,0+8]..[1,0+24])
(* pexp_desc field *)
Pexp_extension "getenv"
[
...
]

最佳答案

您似乎缺少研究 AST 和使用扩展点的基本工具。这些工具是ppx_tools由阿兰·弗里希撰写。其中一个工具正是为了探索 AST 的具体表示而设计的,它的名字是 dumpast。让我们将其应用到以下文件 ast_record.mli:

type card = {
name: string;
address: string;
age: int;
}

输出为

ocamlfind ppx_tools/dumpast ast_record.mli         
ast_record.mli
==>
[{psig_desc =
Psig_type
[{ptype_name = {txt = "card"}; ptype_params = []; ptype_cstrs = [];
ptype_kind =
Ptype_record
[{pld_name = {txt = "name"}; pld_mutable = Immutable;
pld_type = {ptyp_desc = Ptyp_constr ({txt = Lident "string"}, [])}};
{pld_name = {txt = "address"}; pld_mutable = Immutable;
pld_type = {ptyp_desc = Ptyp_constr ({txt = Lident "string"}, [])}};
{pld_name = {txt = "age"}; pld_mutable = Immutable;
pld_type = {ptyp_desc = Ptyp_constr ({txt = Lident "int"}, [])}}];
ptype_private = Public; ptype_manifest = None}]}]
=========

这确认了唱片公司的顺序被保留。

顺便说一句,我建议您研究这些 ppx_tools 的源代码,也许还有 Lwt 附带的 ppx 扩展。它们很短,写得很好,是值得推荐的灵感来源。

关于OCaml AST 记录类型表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34539919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com