Version française
Home     About     Download     Resources     Contact us    
Browse thread
camlp4: str_item quotations for normal syntax
[ 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] camlp4: str_item quotations for normal syntax
Excerpts from Hendrik Tews's message of Mon Mar 31 13:27:27 +0200 2008:
> Hi,
> 
> I am trying to use (anti-) quotations for the normal ocaml syntax
> and run into the following problems:
> 
> 1. when pattern matching over str_item, what's the antiquotation
>    to use to get the list of all str_item's in a structure or in
>    a compilation unit?
> 
>    One can use Ast.list_of_str_item, for instance
> 
>     | <:str_item@loc< module $uid:mname$ = struct $items$ end >> -> 
>            .... (Ast.list_of_str_item items)
> 
>    but what's the antiquotation for directly getting the list?

One  no  longer  have  it. Indeed the representation is no longer a list but a
tree  using  binary  nodes  like  ';;'.  In  expression  one  can use the list
antiquotation  ($list:...$)  but that's a sugar for calling a function, such a
sugar is not really feasible in patterns.

>    I found str_items in Camlp4OCamlRevisedParser, and tried
> 
>     (match ast with
>        | <:str_items< $list:tops$ >> ->
>          Printf.printf "%s has %d top level decls\n"
>            (opt_string input_file) (List.length tops));
> 
>    but there is no quotation expander for str_items. 
> 
>    Further, str_items appears in module_expr but not in implem or
>    top_phrase. Why not?

Hum  no  need for str_item*s* since str_item do the job with it's ';;' (or ';'
in revised) binary node.

> 2. Ast.list_of_str_item is defined but never used, right? I am
>    guessing that there is a line missing in
>    Camlp4QuotationCommon.ml, similar to the one with
>    Ast.stSem_of_list. Right?

No because one cannot inject code in patterns.

> 3. The str_item quotations for the ocaml syntax seem to produce
>    always Ast.StSem(...,..., Ast.StNil...), for instance
> 
>     | <:str_item@loc< type $lid:name$ = $lid:oname$ >> ->
> 
>    gives
> 
>       | Ast.StSem (loc,
>           (Ast.StTyp (_,
>              (Ast.TyDcl (_, name, [], (Ast.TyId (_, (Ast.IdLid (_, oname)))),
>                 [])))),
>           (Ast.StNil _)) ->
> 
>    What do I have to write in order to get just 
> 
>       | Ast.StTyp (loc,
>           (Ast.TyDcl (_, name, [], (Ast.TyId (_, (Ast.IdLid (_, oname)))),
>              [])))
>           ->
> 
>    as I get with the revised qotations?

That's a bug due to an ambiguity in the original grammar since the ';;' is optional.

> 4. What is the quotation for _just_ getting Ast.StSem(_,_,_) for
>    instance for doing
> 
>    List.iter (function
>                | Ast.StSem(_,_,_) -> assert false
>                | .....
>       ) (Ast.list_of_str_item ....)

It  should  be  <:str_item<  $_$ ;; $_$ >>, but perhaps the bug above insert a
useless nil node :(

> 5. What is Register.OCamlPreCastPrinter good for?

Perhaps  not  that useful... It allows to register an existing printer that is
really  tied  to  the  PreCast  world,  it  doesn't  force you to provide some
abstract functor.

> 6. I would be interested in contributing for a version of
>    http://brion.inria.fr/gallium/index.php/Abstract_Syntax_Tree
>    for ocaml syntax. 

Great!

>    Nicolas, Matthieu: What would you prefer as best structure? A
>    separate page with lots of duplication or one page for ocaml
>    and revised syntax, possibly differentiating things with
>    color? I tend to the latter.

The latter seems better.

-- 
Nicolas Pouillard aka Ertai