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 Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by yquem.inria.fr (Postfix) with ESMTP id C123EBC69 for ; Tue, 25 Dec 2007 21:51:24 +0100 (CET) X-IronPort-AV: E=Sophos;i="4.24,206,1196636400"; d="scan'208";a="20682726" Received: from peray.inria.fr (HELO ausone.inria.fr) ([128.93.8.98]) by mail4-relais-sop.national.inria.fr with SMTP; 25 Dec 2007 21:51:30 +0100 Received: by ausone.inria.fr (sSMTP sendmail emulation); Tue, _d Dec 2007 21:50:29 +0100 From: "Nicolas Pouillard" Content-Type: text/plain; charset=UTF-8 Cc: caml-list Subject: Re: [Caml-list] [camlp4 extension] pa_refutable : request for comments To: bluestorm.dylc References: <527cf6bc0712250936k7b7c713eg7ec4a34da4fd2f26@mail.gmail.com> In-Reply-To: <527cf6bc0712250936k7b7c713eg7ec4a34da4fd2f26@mail.gmail.com> Date: Tue, 25 Dec 2007 21:50:29 +0100 Message-Id: <1198614473-sup-1388@ausone.local> User-Agent: Sup/0.3 X-Spam: no; 0.00; camlp:01 camlp:01 syntax:01 foo:01 runtime:01 failwith:01 expr:01 expr:01 constructors:01 subtleties:01 rec:01 rec:01 readable:01 parsing:01 caml-list:01 Excerpts from bluestorm.dylc's message of Tue Dec 25 18:36:27 +0100 2007: > Hi, Hi, > I just created my first "serious" camlp4 (3.10) extension. I'm looking > for comments, and have some questions too. > > The extension (to the classical syntax) enables an explicit use of > non-irrefutable pattern matching in "let" declarations : > let refutable hd::tl = ... > let refutable [a; b; c] = List.map foo ['a'; 'b'; 'c'] > let rec refutable func (Some thing) = ... Looks useful indeed. > The code is available here : http://bluestorm.info/tmp/pa_refutable.ml.html > (side question : are 80 lines of code short enough to be included in > my message ? what is the mailing-list recommended behaviour here ?) I think that's short enough, but colored html page is perhaps more readable. > The actual error-reporting is rather naive : the extension generate a > string containing the location of the refutable pattern in the > original source, wich is raised at runtime using "failwith".. Is there > a more elegant way to do that ? Seems sufficient. > There are 6 repetitive lines of code in my refutable_mono function : > let binds_patt binds _loc = > let patt_of_id (id, _loc) = <:patt< $lid:id$ >> in > Ast.PaTup _loc (Ast.paCom_of_list (List.map patt_of_id binds)) in > let binds_expr binds _loc = > let expr_of_id (id, _loc) = <:expr< $lid:id$ >> in > Ast.ExTup _loc (Ast.exCom_of_list (List.map expr_of_id binds)) in > Is there an better way to do this ? In fact I think this part is wrong. What's happen if you get no variable or just one in the pattern? You will try to build a nil-tuple or a singleton-tuple and that's forbidden. Here is the untested code for patterns: let binds_patt binds _loc = let patt_of_id (id, _loc) = <:patt< $lid:id$ >> in match binds with | [] -> <:patt< () >> | [c] -> patt_of_id c | c :: cs -> <:patt< ( $patt_of_id c$, $list:List.map patt_of_id cs$ ) >> in The cool thing is that by making explicit the tuple (by having more than one element) one avoid resorting to concrete constructors and can use the $list:$ special antiquotation that will insert the paCom_of_list call. > Lastly, i had to duplicate work in the grammar-modification part, > because i didn't manage to use the "opt_rec" rule. I'm not aware of > the subtleties of camlp4 parsing; is there another way ? I don't think there is any subtlety here, just replace: | "let"; "rec"; "refutable"; bi = binding -> <:str_item< value rec $refutable bi$ >> | "let"; "refutable"; bi = binding -> <:str_item< value $refutable bi$ >> by something like: | "let"; r = opt_rec; "refutable"; bi = binding -> <:str_item< value $rec:r$ $refutable bi$ >> Best regards, -- Nicolas Pouillard aka Ertai