鉴于这种类型:
type 'a variable = { name: string; mutable value: 'a }
我正在尝试创建一个可以接受此语法的语法扩展:
var foo = true
...并将其转换为:
let foo = { name = "foo"; value = true }
这是我的尝试:
open Camlp4.PreCast
open Syntax
type 'a variable = { name: string; mutable value: 'a }
EXTEND Gram
expr: LEVEL "top"
[ [ "var"; v = a_LIDENT; "="; e = expr ->
<:expr< let $lid:v$ = { name= $`str:v$ ; value = $e$ } in $e$ >>
] ]
;
END
(我很确定它需要在替换结束时使用 $e$ 来表示“其余部分”,但考虑到我们希望记录的 value 字段具有以下值,它看起来也有点可疑右边的表达式 - 最初我没有结尾 $e$ 并且得到了同样的错误)
我尝试编译:
ocamlc -I +camlp4 camlp4lib.cma -pp camlp4orf -c pa_var.ml
结果是:
File "pa_var.ml", line 10, characters 50-51:
While expanding quotation "expr" in a position of "expr":
Parse error: "}" expected after [label_expr_list] (in [expr])
File "pa_var.ml", line 1, characters 0-1:
Error: Preprocessor error
我不知道为什么它似乎想在记录的名称字段后有一个“}”。(否则,我在正确的轨道上吗?)