Closed ygrek closed 8 years ago
For some reason latest commit handles polymophic types but trips on string list
(it generates abstract type instead o_O) but String.t list
works. I am puzzled.
On Mon, Jan 11, 2016 at 08:37:56PM -0800, ygrek wrote:
For some reason latest commit handles polymophic types but trips on
string list
(it generates abstract type instead o_O) butString.t list
works. I am puzzled.
String.t
also works for me with OCaml 4.02.3, but I get a different error
for string list
:
$ cat q.proto
type l = [ string ] options "ocaml.type" = "string list, f, g"
$ OCAMLRUNPARAM=b compiler/extprotc q.proto
Parse error in OCaml type: Stream.Error("illegal begin of ctyp")
in
string list
Fatal error: exception Loc.Exc_located(_, _)
Raised at file "camlp4/Camlp4/Struct/Loc.ml", line 306, characters 16-35
Called from file "camlp4/Camlp4/Struct/Grammar/Entry.ml", line 59, characters 57-78
Called from file "gen_OCaml.ml", line 141, characters 4-49
Re-raised at file "gen_OCaml.ml", line 145, characters 10-11
Called from file "gen_OCaml.ml", line 171, characters 57-75
Called from file "gen_OCaml.ml", line 409, characters 14-60
Called from file "gencode.ml", line 322, characters 8-40
Called from file "extList.ml", line 154, characters 9-12
Called from file "extList.ml", line 162, characters 1-13
Called from file "gencode.ml", line 303, characters 15-18
Called from file "extprotc.ml", line 119, characters 21-80
Called from file "option.ml", line 25, characters 13-16
$ cat q2.proto
type l = [ string ] options "ocaml.type" = "String.t list, f, g"
$ compiler/extprotc q2.proto
$ cat q2.ml
module L =
struct
type l = String.t list;;
let pp_l ppf x = Extprot.Pretty_print.pp_list Extprot.Pretty_print.pp_string ppf (g x);;
end;;
Mauricio Fernández
Looks like it cannot parse any "compound" type starting with lident
:(
Worse, it chokes on lident
itself :-/ (OCaml 4.02.3, camlp4 4.02+6)
And Camlp4OCamlParser.ml
leaves no doubt it should be covered (as if there were any chance it weren't to begin with...):
| i = a_LIDENT -> <:ctyp< $lid:i$ >>
One more observation: it works for char
char list
int64 list
but not for int
or string
.
Also note that Camlp4.Precast.Gram
parses all those fine.
The real reason is the extension of grammar in compiler/parser.ml
which modifies Camlp4.PreCast.Gram
which conflicts with later usage in compiler/gen_OCaml.ml
. Proper fix pushed.
Thank you! The dangers of uncontrolled global side-effects :-/
Consider :
Ideally I would like to be able to write
but this might have some typing complications that I may not be aware of, while the former (specialized type without free variables) seems to be only hindered by printing bug..