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 discorde.inria.fr (discorde.inria.fr [192.93.2.38]) by yquem.inria.fr (Postfix) with ESMTP id AB93BBC6B for ; Mon, 9 Jul 2007 11:40:05 +0200 (CEST) Received: from bdmail1.accesst.com (pop.bulldoghome.com [83.245.1.230]) by discorde.inria.fr (8.13.6/8.13.6) with ESMTP id l699e5RF008535 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 9 Jul 2007 11:40:05 +0200 Received: from host-84-9-233-143.bulldogdsl.com ([84.9.233.143] helo=[192.168.123.191]) by bdmail1.accesst.com with esmtpa (Exim 4.50) id 1I7pYF-0004ZT-S6; Mon, 09 Jul 2007 10:29:04 +0100 Message-ID: <46920328.2080509@ed.ac.uk> Date: Mon, 09 Jul 2007 10:43:04 +0100 From: Jeremy Yallop User-Agent: Mozilla-Thunderbird 2.0.0.4 (X11/20070622) MIME-Version: 1.0 To: Vincent Hanquez Cc: Jon Harrop , caml-list@yquem.inria.fr Subject: Re: [Caml-list] try .. finally using new camlp4 References: <200707080114.42213.jon@ffconsultancy.com> <20070709090131.GA17462@snarc.org> In-Reply-To: <20070709090131.GA17462@snarc.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Miltered: at discorde with ID 46920275.005 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; camlp:01 expr:01 expr:01 val:01 exn:01 val:01 exn:01 camlp:01 endline:01 endline:01 polymorphic:01 wrote:01 avoids:01 caml-list:01 int:01 Vincent Hanquez wrote: >> EXTEND Gram >> expr: LEVEL "top" >> [[ "try"; f=expr; "finally"; g=expr -> >> <:expr< >> ((function >> | `Val v, g -> g(); v >> | `Exn e, g -> g(); raise e) >> ((try `Val($f$) with e -> `Exn e), (fun () -> $g$))) >> >>]]; >> END > > I don't know camlp4, but why don't you use a more straightforward > (let r = try f() with e -> g(); raise e in g(); r) construct > instead of wrapping/unwrapping the thing into polymorphic variant ? Jon's version avoids name capture. If the user writes let r = 1 in try 2 finally print_endline (string_of_int r) then your version (modulo the unit arguments) expands into let r = 1 in let r = try 2 with e -> print_endline (string_of_int r); raise e in print_endline (string_of_int r); r which prints "2" instead of "1". Jeremy.