Browse thread
[Camlp4] Quotation expander with OCaml syntax
[
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: | 2010-07-26 (16:27) |
From: | Nicolas Pouillard <nicolas.pouillard@g...> |
Subject: | Re: [Caml-list] [Camlp4] Quotation expander with OCaml syntax |
On Mon, 26 Jul 2010 17:41:58 +0200, Raphael Proust <raphlalou@gmail.com> wrote: > On Mon, Jul 26, 2010 at 5:13 PM, Nicolas Pouillard > <nicolas.pouillard@gmail.com> wrote: > > On Mon, 26 Jul 2010 16:41:46 +0200, Raphael Proust <raphlalou@gmail.com> wrote: > > > Hi all, > > Hi, > > > > > [...] > > > > > > (* 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) > > > > > > > > > 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. > > > > > > [...] > > > > 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 *) > > I'd rather not use a constructor because it imposes a strong limitation on the > user (it basically reserves a keyword) whereas the <:on< ... >> solution does > not (<:smthg< ... >> is already "reserved"). You still qualify it if you want to avoid clashes: MyModule.On > And labeling antiquotations is far from ideal since it prevents complex > expressions from being inlined. You basically need to write: > let y = h a in > let z = g x z in > On (f ~y ~z) > instead of: > <:on< f $h a$ $g x z$ >> Nothing prevents you to reserve another syntax for going back to plain OCaml code. > What I basically need is to get an AST with antiquotations and quotations being > special nodes. How is this achievable w/o reimplementing a whole grammar? Doing this amounts to making the almost the same thing than Camlp4OCamlOriginalQuotationExpander but with some filtering code. > The alternative solution is to use raw strings, to find antiquotation marks, to > split the string and to reinject it in the different files. Is there a way to > keep precise _loc information this way? Yes _loc would be hard to preserve this way. -- Nicolas Pouillard http://nicolaspouillard.fr