From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by yquem.inria.fr (Postfix) with ESMTP id 7BDE0BC75 for ; Mon, 21 Feb 2005 17:57:24 +0100 (CET) Received: from pauillac.inria.fr (pauillac.inria.fr [128.93.11.35]) by nez-perce.inria.fr (8.13.0/8.13.0) with ESMTP id j1LGvOtQ023610 for ; Mon, 21 Feb 2005 17:57:24 +0100 Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id RAA07761 for ; Mon, 21 Feb 2005 17:57:23 +0100 (MET) Received: from biggles.scientician.net (0x50a5bb8d.odnxx9.adsl-dhcp.tele.dk [80.165.187.141]) by concorde.inria.fr (8.13.0/8.13.0) with ESMTP id j1LGvMCs030561 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 21 Feb 2005 17:57:23 +0100 Received: from bardur by biggles.scientician.net with local (Exim 4.43) id 1D3Gs6-0004Lr-Fa; Mon, 21 Feb 2005 17:57:22 +0100 Date: Mon, 21 Feb 2005 17:57:22 +0100 From: Bardur Arantsson To: caml-list@inria.fr Subject: Re: [Caml-list] Camlp4 with traditional syntax Message-ID: <20050221165722.GB20112@scientician.net> Mail-Followup-To: caml-list@inria.fr References: <4219D3E9.80003@barettadeit.com> <20050221125529.GA20112@scientician.net> <20050221.162224.41631465.oandrieu@nerim.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20050221.162224.41631465.oandrieu@nerim.net> User-Agent: Mutt/1.5.8i X-Miltered: at nez-perce with ID 421A12F4.000 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Miltered: at concorde with ID 421A12F3.000 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Spam: no; 0.00; caml-list:01 syntax:01 andrieu:01 wrote:01 baretta:01 wrote:01 hendrik:01 tews:01 baretta:01 expander:01 bypassing:01 expr:01 struct:01 ocaml:01 expander:01 X-Spam-Checker-Version: SpamAssassin 3.0.2 (2004-11-16) on yquem.inria.fr X-Spam-Status: No, score=0.1 required=5.0 tests=FORGED_RCVD_HELO autolearn=disabled version=3.0.2 X-Spam-Level: On Mon, Feb 21, 2005 at 04:22:24PM +0100, Olivier Andrieu wrote: > > Bardur Arantsson [Mon, 21 Feb 2005]: > > On Mon, Feb 21, 2005 at 01:28:25PM +0100, Alex Baretta wrote: > > > Hendrik Tews wrote: > > > >Alex Baretta writes: > > > > There is one more issue with Camlp4: it does not allow for quotations > > > > to expand to generic syntactic elements. Often, I use quotations which > > > > expand to module definitions. I had to implement my own quotation > > > > expander, bypassing the limitations of Camlp4 to achieve this. > > > >I don't quite understand, what's wrong with > > > >let me = <:module_expr< struct $ list of module def's $ end >> > > > >in > > > > <:str_item< module $some_name$ = $me$ >> > > > We use quotation expanders to embed completely different > > > languages, such as SQL, within Ocaml code. Specifically, the SQL > > > quotation expander compiles SQL code to an Ocaml module. CamlP4 > > > signals an error because quotations are only meant to be used as > > > expressions or as patterns, IIRC. > > IIRC quotations can expand to arbitrary ASTs. Only the point of > > *use* (ie. substitution) determines which types of ASTs will be > > accepted. > No, quotations can expand to only expressions or patterns. See the > type of a quotation expander in quotation.mli : > type expander = > | ExStr of (bool -> string -> string) > | ExAst of ((string -> MLast.expr) * (string -> MLast.patt)) > As Alex mentionned, ocpp expands quotations everywhere (but only deals > with string-expanding quotations, not the AST ones), so it can be used > to generate structure items (module elements). You're right. I got confused by the distinction between user-defined and pre-defined quotation expanders. > > Of course, if you're generating things like module interfaces and > > implementations, you'll need to generate them side by side since > > there is no "combined module interface+implementation" AST node > > type. > The camlp4 AST does have this kind of nodes, as Martin mentionned. > You can use : > # fun a b -> <:str_item< declare $a$ ; $b$ ; end >> ;; > - : MLast.str_item -> MLast.str_item -> MLast.str_item = > or : > # fun l -> <:str_item< declare $list:l$ end >> ;; > - : MLast.str_item list -> MLast.str_item = Uh, yes, you use to generate module implementations, but when I looked last you couldn't use MLast.sig_item and MLast.str_item interchangably, so for instance, you couldn't ask pr_(o|r) to pretty-print a str_item as a module interface. Instead you had to also generate a sig_item and pretty-print that. (For good reason, you don't necessarily want to have everything inside the module visible from the outside...). That's all I was referring to by generating them "side by side". -- Bardur Arantsson - It might look like I'm standing motionless, but I'm actively waiting for my problems to go away. Scott Adams