From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id VAA06524; Tue, 21 Oct 2003 21:18:33 +0200 (MET DST) 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 VAA12277 for ; Tue, 21 Oct 2003 21:18:31 +0200 (MET DST) Received: from nef.ens.fr (nef.ens.fr [129.199.96.32]) by concorde.inria.fr (8.11.1/8.11.1) with ESMTP id h9LJIU118870 for ; Tue, 21 Oct 2003 21:18:30 +0200 (MET DST) Received: from clipper.ens.fr (clipper-gw.ens.fr [129.199.1.22]) by nef.ens.fr (8.12.10/1.01.28121999) with ESMTP id h9LFQFcp032174 ; Tue, 21 Oct 2003 17:26:15 +0200 (CEST) Received: from localhost (frisch@localhost) by clipper.ens.fr (8.12.3/jb-1.1) id h9LFQBWZ029644 ; Tue, 21 Oct 2003 17:26:11 +0200 (MET DST) X-Authentication-Warning: clipper.ens.fr: frisch owned process doing -bs Date: Tue, 21 Oct 2003 17:26:11 +0200 (MET DST) From: Alain.Frisch@ens.fr X-X-Sender: frisch@clipper.ens.fr Reply-To: Alain.Frisch@ens.fr To: Richard Jones cc: Caml list Subject: Re: [Caml-list] OCaml wishlist In-Reply-To: <20031021142921.GA6736@redhat.com> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Virus-Scanned: by amavisd-milter (http://amavis.org/) X-Loop: caml-list@inria.fr X-Spam: no; 0.00; alain:01 frisch:01 caml-list:01 wishlist:01 'return':99 foo:01 indented:01 camlp:01 camlp:01 abstractions:01 type-safety:01 abstraction:01 struct:01 inference:01 alain:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk On Tue, 21 Oct 2003, Richard Jones wrote: > 1. 'return' from a function. eg: > > let foo x = > if x < 0 then return "OSL"; > (* long & complex code *) > return "some other string" > > I know I can do this using if ... else, but when you have multiple > levels of if ... else you end up being indented so far across the > screen as to make coding unpleasant. This is particularly a concern > with writing basically imperative UI code. > > Is it possible to do something like this with camlp4? (as a stopgap - > I still think it should go into the language) With Camlp4 and the Obj module, yes, it should be possible, but inefficient. I assume you want to be able to escape from loops, so you have to use exceptions (if you don't want to escape from loops, I guess you can avoid using exceptions, with a lot of extra option types). You can use Camlp4 to expand fun x -> ... (return e1) ... (return e2) ... e (the return statements are not under abstractions) to: fun x -> (try ... (raise (Return (Obj.repr (e1 : 'a)))) ... (raise (Return (Obj.repr (e1 : 'a)))) ... e2 with Return x -> Obj.magic x) : 'a with a global definition: exception Return of Obj.t You need the 'a annotation to ensure type-safety (btw, would the above version be correct in all cases?). Of course the 'a name should be unique for the abstraction. AFAIK, it is not possible to define in a syntax extension a local exception (inside a "let module M = struct ... end in ...") with an argument of the return type (which is unknown at preprocessing time, and moreover it might be polymorphic). Needless to say, this will be inefficient. > 2. abstract data type syntactic sugar: How does it interact with type inference? Cheers, Alain ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners