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 VAA15761; Tue, 21 Oct 2003 21:01:56 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id VAA08013 for ; Tue, 21 Oct 2003 21:01:45 +0200 (MET DST) Received: from nexus.stwing.upenn.edu (NEXUS.STWING.UPENN.EDU [165.123.132.61]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id h9LJ1i114400 for ; Tue, 21 Oct 2003 21:01:44 +0200 (MET DST) Received: from force.stwing.upenn.edu (root@force.stwing.upenn.edu [165.123.132.65]) by nexus.stwing.upenn.edu (8.12.10/8.12.9) with ESMTP id h9LHSEJn006724 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 21 Oct 2003 13:28:15 -0400 (EDT) Received: from force.stwing.upenn.edu (wlovas@localhost [127.0.0.1]) by force.stwing.upenn.edu (8.12.10/8.12.9) with ESMTP id h9LHSDGQ026943 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 21 Oct 2003 13:28:14 -0400 (EDT) Received: (from wlovas@localhost) by force.stwing.upenn.edu (8.12.10/8.12.9/Submit) id h9LHSDWA026941; Tue, 21 Oct 2003 13:28:13 -0400 (EDT) Date: Tue, 21 Oct 2003 13:28:13 -0400 From: William Lovas To: caml-list@inria.fr Cc: Richard Jones Subject: Re: [Caml-list] OCaml wishlist Message-ID: <20031021172812.GA26066@force.stwing.upenn.edu> Mail-Followup-To: caml-list@inria.fr, Richard Jones References: <20031021142921.GA6736@redhat.com> <20031021145531.GA14086@roke.freak> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20031021145531.GA14086@roke.freak> User-Agent: Mutt/1.5.4i X-Loop: caml-list@inria.fr X-Spam: no; 0.00; lovas:01 wlovas:01 stwing:01 caml-list:01 wishlist:01 michal:01 moskal:01 disambiguate:01 val:01 val:01 o'caml's:01 syntaxes:01 camlp:01 wishlist:01 'return':99 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk > On Tue, Oct 21, 2003 at 03:29:21PM +0100, Richard Jones wrote: On Tue, Oct 21, 2003 at 04:55:31PM +0200, Michal Moskal wrote: > > 2. abstract data type syntactic sugar: > > obj#call [ or: obj->call ] > > > > is exactly equivalent to: > > > > M.call obj > > let f a b c = a->add b c > > What type does f have? You could disambiguate by adding a module qualifier: `a->M.add b c'. But then, this can be done with an ordinary infix operator: # let (=>) obj meth = meth obj;; val ( => ) : 'a -> ('a -> 'b) -> 'b = # let l = [(1, "abc")];; val l : (int * string) list = [(1, "abc")] # l=>List.length;; - : int = 1 # l=>List.assoc 1;; - : string = "abc" ... as long as you don't mind using a slightly different arrow, anyway -- `->' isn't a valid identifier due to O'Caml's lexical conventions. Viewed in this way, though, this is really no more than an obfuscation of code. Providing multiple syntaxes for the same concept starts one down the slippery slope of creating a write-only language (witness Perl). > > After writing a fair bit of OCaml in commercial situations (although > > I'm by no means an expert, and really should learn camlp4), here's my > > wishlist: > > > > 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 one's quite a bit more difficult, though: what is the type of a `return'? Under the current typing rules for if-then-else expressions, it must be `unit', since the `else' branch has been omitted. But if it's unit, then the function returns unit, which is incorrect. What you want is a return *statement*, but such a beast is incompatible with O'Caml, since O'Caml is an expression-oriented language. I don't see an easy way of making a `return' expression that behaves the way you want it to. However, i will point out that code indentation is merely a programmer convention, and is not enforced by the syntax of the language -- so you could do what you want using ordinary O'Caml if-then-else expressions and *still* not have your code be too indented: let foo x = if x < 0 then (* special case for negative x *) "OSL" else (* normal case *) "some other string" I don't think it would be beneficial in the long run to clutter up the core language with these sorts of purely syntactic issues -- that's why we have camlp4, isn't it? Better, though, in my opinion, would be to adapt your mental syntax to fit the functional style than to adapt the functional language to cater to your imperative style. That way, you end up producing clearer code that can be read by any competent O'Caml programmer -- a major win for the poor maintainer 10 years down the road! :) cheers, William ------------------- 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