[
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: | -- (:) |
| 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