caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* combining camlp4 extensions
@ 2006-09-17  7:22 Pietro Abate
  2006-09-17  7:41 ` [Caml-list] " Pietro Abate
  0 siblings, 1 reply; 2+ messages in thread
From: Pietro Abate @ 2006-09-17  7:22 UTC (permalink / raw)
  To: ocaml ml

hi all,

In my project I've multiple similar (independent) extensions. These all
share a common part. In order to avoid code duplication (I don't want to
duplicate the common part in every and each extension), I'm trying to
split them in different modules and then generate one library for each
extensions by linking the common part with each module.

I've cooked up a small example to explain my idea.

I've 3 files: ext_repeat.ml and repeat.ml and main.ml

------------ ext_repeat.ml
open Pcaml
let reexpr = Grammar.Entry.create Pcaml.gram "reexpr";;
let extend () =
    EXTEND
    GLOBAL: reexpr;
      reexpr: [[ e = expr -> e ]];
    END
;;
-----------

-----------repeat.ml
open Pcaml
let reexpr = Grammar.Entry.create Pcaml.gram "reexpr";;
let extend () =
    EXTEND
    GLOBAL: reexpr expr ;
      expr: LEVEL "expr1"
        [[ "repeat"; e1 = reexpr; "until"; e2 = expr ->
              <:expr< do { $e1$; while not $e2$ do { $e1$; } } >> ]];

      reexpr: [[]];
    END
;;
--------------

-----------main.ml
let main () =
    Repeat.extend ();
    Ext_repeat.extend ();
in main ()
-----------

repeat contains a modified version of the canonical repeat example found
in the camlp4 manual (the common part). The ext_repeat contains a small
extension that is mean to complement the extension defined in the repeat
module (the extension part that differ. I can have many of these in my
project).  The main file is just a device to fire up these extensions.

I compile them with:

ocamlc -pp "camlp4o pa_extend.cmo q_MLast.cmo" -I +camlp4 -c repeat.ml
ocamlc -pp "camlp4o pa_extend.cmo q_MLast.cmo" -I +camlp4 -c ext_repeat.ml
ocamlc -c main.ml
ocamlc ext_repeat.cmo repeat.cmo main.cmo -linkall -a -o pa_combine.cmo

camlp4o ./pa_combine.cmo pr_o.cmo ex.ml

The example that I'm using is (ex.ml):
--------------
let main () =
  let i = ref 0 in
  repeat print_int !i; incr i until !i = 10;
  print_newline ()
let _ = main ()
------------

however this arrangement doesn't work:
camlp4o ./pa_combine.cmo pr_o.cmo ex.ml
File "", line 0, characters 0-1:
Parse error: [reexpr] expected after 'repeat' (in [expr])
Uncaught exception: Stream.Error("[reexpr] expected after 'repeat' (in [expr])")

Is there a way of achieving this kind of modularity with camlp4 ?

thanks !
p

ps:
this is not a re-play of an other thread a while ago...
http://caml.inria.fr/pub/ml-archives/caml-list/2006/07/c58bd2a0270a539cccc5a1f7008f8b5c.en.html


-- 
++ Blog: http://blog.rsise.anu.edu.au/?q=pietro
++ 
++ "All great truths begin as blasphemies." -George Bernard Shaw
++ Please avoid sending me Word or PowerPoint attachments.
   See http://www.fsf.org/philosophy/no-word-attachments.html


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Caml-list] combining camlp4 extensions
  2006-09-17  7:22 combining camlp4 extensions Pietro Abate
@ 2006-09-17  7:41 ` Pietro Abate
  0 siblings, 0 replies; 2+ messages in thread
From: Pietro Abate @ 2006-09-17  7:41 UTC (permalink / raw)
  To: caml-list

There's something magic about this list... as soon as I post something I
come up with a solution... must be the ocaml-guru karma reaching my
office... anyway...

This example now works as expected... 

Is this the best way of solving this problem ?

------------ ext_repeat.ml
open Pcaml
open Repeat (* <--------- I need to refer to the grammar entity declared
               in the common part to be able to extend it !!!!!! *)

let extend () =
    EXTEND
    GLOBAL: reexpr;
      reexpr: [[ e = expr -> e ]];
    END
;;
-----------

-----------repeat.ml
open Pcaml
let reexpr = Grammar.Entry.create Pcaml.gram "reexpr";;
let extend () =
    EXTEND
    GLOBAL: reexpr expr ;
      expr: LEVEL "expr1"
        [[ "repeat"; e1 = reexpr; "until"; e2 = expr ->
              <:expr< do { $e1$; while not $e2$ do { $e1$; } } >> ]];

      reexpr: [[]];
    END
;;
--------------

-- 
++ Blog: http://blog.rsise.anu.edu.au/?q=pietro
++ 
++ "All great truths begin as blasphemies." -George Bernard Shaw
++ Please avoid sending me Word or PowerPoint attachments.
   See http://www.fsf.org/philosophy/no-word-attachments.html


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-09-17  7:41 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-09-17  7:22 combining camlp4 extensions Pietro Abate
2006-09-17  7:41 ` [Caml-list] " Pietro Abate

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).