English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
[Camlp4] Quotation expander with OCaml syntax
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2010-07-26 (15:13)
From: Nicolas Pouillard <nicolas.pouillard@g...>
Subject: Re: [Caml-list] [Camlp4] Quotation expander with OCaml syntax
On Mon, 26 Jul 2010 16:41:46 +0200, Raphael Proust <raphlalou@gmail.com> wrote:
> Hi all,


> I'm working on a syntax extension as part of an internship in the
> Ocsigen team. The aim of the syntax extension is to split the code of a web
> application in two separate files: one for the client and one for the
> server. A
> few transformations are to take place in the process.
> Quotations are to be transformed into client code while antiquotations can
> refer
> to server side values transmitted to the client at runtime.
> In order to avoid any XY problems, here is an abstracted and simplified
> example
> of the expected behavior:
> (* Pre-parsed code: *)
> let start = <:on< f $y$ >> in
> let html_node =
>  span ~a:[onclick start] "some text" (* a is used for (html) attributes *)
> (* Server side post-parsed code: *)
> let start _arg1 =
>  "call_closure(some_unique_name," ^ mymarshall _arg1 ")"
> in
> let html_node = span ~a:[onclick (start y)] "some text"
> (* Client side post-parsed code: *)
> let _ = register_closure some_unique_name (fun _arg1 -> f _arg1)
> If the example isn't clear enough I can detail it a little bit more.
> I'm unsure of what is the standard way of doing such a thing in Camlp4. What
> I
> have in mind is to use the original Ocaml syntax for the quotation expander.
> This would (IIUC) allow me to filter the AST to transform every
> antiquotation
> found inside the quotation itself.
> I'm not sure this is the ideal way of doing such a thing because of the size
> of
> the pattern matching in the AST filter. On the other hand, because the
> quotation
> is supposed to contain valid OCaml code, it seems normal to reuse the
> original
> parser.

If the <:on<...>> contents is valid OCaml syntax I would suggest you to not go
in the quotations direction. You will avoid a ton of syntactic issues.

What I suggest you is to directly use camlp4 filters, for instance by changing
the meaning of some constructor application and labels for antiquotations:

(* Pre-parsed code: *)
let start = On (f ~y) in
let html_node =
  span ~a:[onclick start] "some text" (* a is used for (html) attributes *)

Have fun,

Nicolas Pouillard