caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* Cross-module data in camlp4
@ 2008-04-27 22:52 Richard Jones
  2008-04-27 23:58 ` [Caml-list] " Martin Jambon
  0 siblings, 1 reply; 2+ messages in thread
From: Richard Jones @ 2008-04-27 22:52 UTC (permalink / raw)
  To: caml-list

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


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

* Re: [Caml-list] Cross-module data in camlp4
  2008-04-27 22:52 Cross-module data in camlp4 Richard Jones
@ 2008-04-27 23:58 ` Martin Jambon
  0 siblings, 0 replies; 2+ messages in thread
From: Martin Jambon @ 2008-04-27 23:58 UTC (permalink / raw)
  To: Richard Jones; +Cc: caml-list

On Sun, 27 Apr 2008, Richard Jones wrote:

> 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.

Yes. It's a global table that ignores everything about module boundaries.


> 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!

I had some ideas on the subject:

   http://caml.inria.fr/pub/ml-archives/caml-list/2007/01/6f2e2f9db39543e92806742ddc10fa5f.en.html

Nothing clear comes out of this...


Martin

--
http://wink.com/profile/mjambon
http://mjambon.com


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

end of thread, other threads:[~2008-04-28  0:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-04-27 22:52 Cross-module data in camlp4 Richard Jones
2008-04-27 23:58 ` [Caml-list] " Martin Jambon

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).