Version française
Home     About     Download     Resources     Contact us    
Browse thread
problem with camlp4
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Nicolas Pouillard <nicolas.pouillard@g...>
Subject: Re: [Caml-list] problem with camlp4
On 7/3/07, Benedikt Grundmann <benedikt@cardexpert.net> wrote:
> Hi everybody,
>
> I'm having a problem with a syntax extension I'm trying to write, the
> smallest sample that I could come up with, that still shows the
> problem is the following:
>
> (*pp camlp4orf *)
>
> open Camlp4.PreCast
>
> let test _loc =
>   let num = 0 in
>   let acc = <:match_case<>> in
>     (*
>   <:match_case< true -> $expr:num$ | $acc$ >>
>      *)
>   <:match_case< true -> 0 | $acc$ >>
>
> If I comment out the last line and instead enable the line above I get
> this error:
>
> ocamlc -c -pp "camlp4orf " -thread -g -I
> /home/bene/godi/lib/ocaml/std-lib/camlp4 sample.ml
> File "sample.ml", line 8, characters 23-25:
> While expanding quotation "match_case" in a position of "expr":
>   Parse error: "->" expected after [opt_when_expr] (in [match_case0])

First, "expr" in $expr:...$ is not a valid antiquotation name,
(perhaps it should be) but here you can use $exp:...$ or even just
$...$ since it's not ambiguous that after the "->" one waits an
expression.

Second, you try to put an integer right here.
You need to make a expression node for it (as told by other answers):
- A constant can be put directly: <:expr< 0 >>
- A string expression representing an integer can be put like that:
<:expr< $int:"0"$ >>
- An integer expression can be used with this sugar: <:expr< $`int:0$ >>

The last but not the least, in revised <:match_case< true -> 0 >> is
nothing more than <:match_case< _ -> 0 >>. Since the true constant is
spelled True with a capital T like any other data constructor.

Cheers,

-- 
Nicolas Pouillard