Hello,
I have come across a weirdness in camlp4. Maybe someone can help with
this puzzle.
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 ";" ; "|"->
expand_term_list loc l ] ];
END;;
I compile the source below with the extension:
....
let t1 =
List.iter (fun i -> print_endline i) ["1"; "f(X,Y)"; "g(X,Y)"; "4"]
in
()
And the execution gives me:
4
If I generate the original and revised syntax output using the extension
above using for example:
camlp4o -I . pr_o.cmo pa_$(NAME).cmo $(PROG).ml -o $(PROG).ppo
camlp4o -I . pr_r.cmo pa_$(NAME).cmo $(PROG).ml -o $(PROG).ppr
I get for $(PROG).ppo
...
let t1 =
List.iter (fun i -> print_endline i) ["1"; "f(X,Y)"; "g(X,Y)"; "4"]
in
()
which is what I expect for the original syntax... but for the revised
syntax $(PROG).ppr I get:
let t1 =
do {
print_string "Not implemented for list ";
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. This explains why I
initially 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.
Can anyone tell me what mess I have done?
TIA,
Hugo Ferreira.
Hugo Ferreira wrote:
> Hello,
>
> I would like to convert an Ocaml expression:
>
> let t1 = | ["f(X,Y)"; "g(X,Y)"] | in ()
>
> to:
>
> let t1 =
> List.iter (fun i -> print_endline i) ["f(X,Y)"; "g(X,Y)"]
> in
> ()
>
> To do this I use:
>
> 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 ";" ; "|" -> expand_term_list loc l ]
> ];
> END;;
>
>
> Unfortunately the output I get is:
>
> let t1 =
> List.iter (fun i -> print_endline i) [["f(X,Y)"; "g(X,Y)"]]
> in
> ()
>
> As I understand it, we have to do list construction ourselves seeing as
> we have no quotations for this. But it seems that the parameter "l" I am
> passing to the function "expand_term_list" is an AST element and not a
> list of AST nodes. How do I actual get the list elements?
>
> TIA.
> Hugo F.
>
>
>
>
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"ocaml-developer" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/ocaml-developer?hl=en
For other OCaml forums, see http://caml.inria.fr/resources/forums.en.html
-~----------~----~----~----~------~----~------~--~---