[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2007-03-20 (10:54) |
From: | Nicolas Pouillard <nicolas.pouillard@g...> |
Subject: | Re: [Caml-list] camlp4: processing lists |
On 3/20/07, Hugo Ferreira <hmf@inescporto.pt> wrote: > Hello, > > I have sent this post to the new ocaml-developer list but am resending > it here in the hopes that someone can help me. I have come across a > weirdness in camlp4. Maybe someone can explain this puzzle to me. > > I have the following extension: > > let expand_term_list loc l = > let nl = <:expr< [] >> in > let nl = List.fold_right (fun h t -> > <:expr< [$h$::$t$] >> > ) l nl in > <:expr< > do { > List.iter (fun i -> print_endline i) $nl$ > } > >> > > EXTEND > Pcaml.expr: [ > [ > "|" ; "[" ; l = LIST0 Pcaml.expr SEP ";" ; "]" ; "|"-> Pcaml.expr is too greedy here. Since 1; 2 is a valid ocaml expression. You need to choose another level ("expr1" in your case and "top" in 3.10). > "|" ; "[" ; l = LIST0 Pcaml.expr LEVEL "expr1" SEP ";" ; "]" ; "|"-> > expand_term_list loc l ] ]; > END;; > [...] > > let t1 = > do { > print_string "Not implemented for list "; Here you reached a bug (fixed for 3.10) > List.iter (fun i -> print_endline i) > [do { "1"; "f(X,Y)"; "g(X,Y)"; "4" }] > } > in > () > > which ... to say the least is *not* what I expected. I initially I > though I had but one Pcaml.expr and not a list of those. What seems > to be happening is that the revised syntax is used to generate the > code and this is wrong. The in revised 1; 2 is not a valid expression you need to add do { ... } thus by printing it in the revised syntax you see that was not what you want. BTW it was a bug in camlp4 to print [1; 2] where it was [(1; 2)]. Hope this helps, -- Nicolas Pouillard