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=1.1 required=5.0 tests=AWL,SPF_NEUTRAL autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from discorde.inria.fr (discorde.inria.fr [192.93.2.38]) by yquem.inria.fr (Postfix) with ESMTP id F3BFCBC6B for ; Thu, 9 Aug 2007 20:32:42 +0200 (CEST) Received: from ausone.inria.fr (peray.inria.fr [128.93.8.98]) by discorde.inria.fr (8.13.6/8.13.6) with SMTP id l79IWULA010023; Thu, 9 Aug 2007 20:32:31 +0200 Received: by ausone.inria.fr (sSMTP sendmail emulation); Thu, _d Aug 2007 20:32:08 +0200 From: "Nicolas Pouillard" Cc: Inria Ocaml Mailing List Subject: Re: [Caml-list] Question on camlp4 3.10 To: Benedikt Grundmann References: <9b415f950707260646v2dd6be3ds71a6d6ff3cd12fd8@mail.gmail.com> <1185457805-sup-9231@ausone.inria.fr> <9b415f950707260657v6f2f92c6s84e2334f8c34e137@mail.gmail.com> <1185458485-sup-4306@ausone.inria.fr> <9b415f950707270652v61ce2302nd62ee5a2025cd09c@mail.gmail.com> In-Reply-To: <9b415f950707270652v61ce2302nd62ee5a2025cd09c@mail.gmail.com> Date: Thu, 09 Aug 2007 20:32:08 +0200 Message-Id: <1186684324-sup-6243@ert.local> User-Agent: Sup/0.1.$Revision:$ Content-Disposition: inline Content-Type: text/plain; charset=utf-8 X-j-chkmail-Score: MSGID : 46BB5DBE.000 on discorde : j-chkmail score : X : 0/20 1 0.000 -> 1 X-Miltered: at discorde with ID 46BB5DBE.000 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; camlp:01 camlp:01 toplevel:01 ocaml:01 lib:01 toplevel:01 ocaml:01 lib:01 cmo:01 val:01 abstr:01 'self:01 'self:01 syntax:01 syntax:01 Excerpts from Benedikt Grundmann's message of Fri Jul 27 15:52:43 +0200 2007: > Where can I find more documentation on camlp4 filter? I assumed that > I should be able to use Camlp4FoldGenerator, but I already failed at > importing it into the toplevel, to interactively explore it: > > bene@discworld:trunk$ rlwrap ocaml > Objective Caml version 3.10.0 > > # #load "camlp4orf.cma";; > Camlp4 Parsing version 3.10.0 > > # #load "camlp4lib.cma";; > # open Camlp4.PreCast;; > # class fold = Camlp4Filters.GenerateFold.generated;; > [tons of #load camlp4*.cma which all didn't get me Camlp4Filters into > the toplevel] > Here is an ocaml *toplevel* session that use the fold generator (it's simpler to use it directly). Note that's the CVS version (release310 branch). $ rlwrap ocaml camlp4orf.cma camlp4lib.cma -I +camlp4/Camlp4Filters Camlp4FoldGenerator.cmo Objective Caml version 3.10.1+dev0 (2007-05-21) Camlp4 Parsing version 3.10.1+dev0 (2007-05-21) # open Camlp4.PreCast;; # let _loc = Loc.ghost;;val _loc : Camlp4.PreCast.Loc.t = # module M = Camlp4FoldGenerator.Make(Camlp4.PreCast.AstFilters);; ... # Camlp4.PreCast.Printers.OCaml.print_implem (M.processor#str_item <:str_item< type t = [ Var of var | App of t and t | Lam of var and t ] and var = string; class map = Camlp4FoldGenerator.generated; >>);; type t = | Var of var | App of t * t | Lam of var * t and var = string;; class map = object ((o : 'self_type)) method string : string -> 'self_type = o#unknown;; method var : var -> 'self_type = o#string;; method t : t -> 'self_type = function | Var _x -> let o = o#var _x in o | App (_x, _x_i1) -> let o = o#t _x in let o = o#t _x_i1 in o | Lam (_x, _x_i1) -> let o = o#var _x in let o = o#t _x_i1 in o;; method unknown : 'a. 'a -> 'self_type = fun _ -> o;; end;; - : unit = () > > And another question, how should one handle errors in a syntax > extension? One of my syntax extension handles only part of the full > ocaml type language, but instead of rewriting the type parser, I use > the original parser and apply a function on the Camlp4.Ast, so > sometimes I encounter a node in the ast that I cannot handle, what > should I do then? > > Currently I do: > > match t with > | <:ctyp< ... > -> ... > | _ -> > let _loc = Ast.loc_of_ctyp t in > Printf.eprintf "pa_message: Don't know how to handle the type > at %s\n%!" > (Loc.to_string _loc); > exit 1 prefer raise an exception instead of exiting. > > But I'm sure that there is a better builtin way?! (For example it > would be nice if I could > include a textual representation of t in the error message) You can instanciate the ocaml pretty printer and use the #ctyp method. HTH > > > 2007/7/26, Nicolas Pouillard : > > Ah, sorry I didn't read the second part. It's a lot harder to have it correct > > unless you completely ignore "open". You should do that with a Camlp4 filter, > > that store the module path while traversing module declaration in a topdown > > way. > > > > > > > > 2007/7/26, Nicolas Pouillard : > > > > Look at the Camlp4MacroParser extension, there is __FILE__. > > > > > > > > Excerpts from Benedikt Grundmann's message of Thu Jul 26 15:46:26 +0200 2007: > > > > > How can I get the name of the module where my syntax extension is > > > > > applied? For simplicity assume that I would like to write a MODULE > > > > > macro similar to __FILE__ in c. > > > > > > > > > > shell> cat > test.ml > > > > > let _ = print_endline MODULE > > > > > > > > > > shell> ./test > > > > > Test > > > > > shell> cat > test2.ml > > > > > module M = > > > > > struct > > > > > let _ = print_endline MODULE > > > > > end > > > > > > > > > > shell> ./test2 > > > > > Test.M > > > > > > > > > > > > > > > Cheers, > > > > > > > > > > Bene > > > > > > > > > > > > > -- > > > > Nicolas Pouillard aka Ertai > > > > > > > > > > > -- > > Nicolas Pouillard aka Ertai > > > -- Nicolas Pouillard aka Ertai