From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=AWL autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by yquem.inria.fr (Postfix) with ESMTP id 37A61BBC1 for ; Mon, 28 Apr 2008 00:52:09 +0200 (CEST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsIBAKygFEhQRFuwiGdsb2JhbACRWgEBAQ8glno X-IronPort-AV: E=Sophos;i="4.25,713,1199660400"; d="scan'208";a="10138415" Received: from concorde.inria.fr ([192.93.2.39]) by mail2-smtp-roc.national.inria.fr with ESMTP; 28 Apr 2008 00:52:09 +0200 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by concorde.inria.fr (8.13.6/8.13.6) with ESMTP id m3RMq8Hl014949 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=OK) for ; Mon, 28 Apr 2008 00:52:09 +0200 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsIBAKygFEhQRFuwiGdsb2JhbACRWgEBAQ8glno X-IronPort-AV: E=Sophos;i="4.25,713,1199660400"; d="scan'208";a="10138414" Received: from furbychan.cocan.org ([80.68.91.176]) by mail2-smtp-roc.national.inria.fr with ESMTP; 28 Apr 2008 00:52:08 +0200 Received: from rich by furbychan.cocan.org with local (Exim 4.63) (envelope-from ) id 1JqFj5-0006he-Hh for caml-list@inria.fr; Sun, 27 Apr 2008 23:52:07 +0100 Date: Sun, 27 Apr 2008 23:52:07 +0100 To: caml-list@inria.fr Subject: Cross-module data in camlp4 Message-ID: <20080427225207.GA24916@annexia.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.13 (2006-08-11) From: Richard Jones X-Miltered: at concorde with ID 48150398.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; camlp:01 syntax:01 syntax:01 camlp:01 hashtbl:01 hash:01 substituted:01 compilation:01 compilation:01 regexps:01 lib:01 regexps:01 lib:01 mli:01 val:01 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