Version française
Home     About     Download     Resources     Contact us    
Browse thread
Cross-module data in camlp4
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Richard Jones <rich@a...>
Subject: Cross-module data in camlp4
I'm trying to add named patterns to my bitmatch syntax extension.  The
idea would be you could write (exact syntax isn't nailed down yet):

  let p = BITMATCH { a : 4; b : 4 } ;;

  bitmatch bs with
  | { p } -> (a, b)

  let f a b = BITSTRING p

This is analogous to micmatch's Named regular expressions feature:

  http://martin.jambon.free.fr/micmatch-manual.html#htoc5
eg:
  RE phone = digit{3} '-' digit{4}

Reading the code to micmatch, these are implemented by saving the
camlp4 AST into a Hashtbl, so the example above would create a hash
entry ("phone" -> abstract syntax tree of (digit{3} '-' digit{4})).
At the point of use of the named RE, the AST is substituted.

Of course micmatch's scheme only works if the named RE appears in the
same compilation unit as the substitution.  There is no way that I can
see to save these named expressions across compilation units.  In
other words this is not allowed:

  --- my_regexps_lib.ml -----
  RE phone = digit{3} '-' digit{4}

  --- my_regexps_lib.mli -----
  val phone : Micmatch.regexp

  --- another file -----
  open My_regexps_lib
  (* ... and use 'phone' *)

I think this limits the usefulness of named expressions, but at the
same time I don't know how one would go about implementing
cross-module named expressions.  Is it even possible?  Presumably if
it could be done at all, we'd have to save the camlp4 AST
representation into the output file (*.cmo).  It would be easy enough
to marshal the AST into a string at the point of definition.  I don't
quite see how it can be accessed & unmarshalled at the point of use
however.

Any insights here gratefully accepted!

Rich.

-- 
Richard Jones
Red Hat