Учитывая этот тип:
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 $, чтобы сказать «остальное», но этотакже выглядит подозрительно, учитывая, что мы хотим, чтобы поле значения записи имело значение выражения справа - изначально у меня не было конца $ e $ там, и я получил ту же ошибку)
Iпопробуйте скомпилировать с помощью:
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
Я не знаю, почему кажется, что он хочет иметь "}" после поля имени записи.(Иначе я на правильном пути?)