From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id JAA07661 for caml-redistribution; Wed, 1 Sep 1999 09:57:29 +0200 (MET DST) 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 VAA29248 for ; Tue, 31 Aug 1999 21:06:38 +0200 (MET DST) Received: from tequila.cs.yale.edu (TEQUILA.CS.YALE.EDU [128.36.229.152]) by nez-perce.inria.fr (8.8.7/8.8.7) with ESMTP id VAA02133 for ; Tue, 31 Aug 1999 21:06:36 +0200 (MET DST) Received: from tequila.cs.yale.edu (localhost [127.0.0.1]) by tequila.cs.yale.edu (8.9.3/8.9.3) with SMTP id PAA28897 for ; Tue, 31 Aug 1999 15:06:27 -0400 To: caml-list@inria.fr Sender: weis From: "Stefan Monnier" Newsgroups: lists.caml Subject: Re: convincing management to switch to Ocaml References: <37C661C2.D374D8F9@ps.uni-sb.de> <199908300802.KAA15269@pauillac.inria.fr> <3.0.6.32.19990831053557.0096ea40@mail.triode.net.au> Date: 31 Aug 1999 15:03:31 -0400 Message-ID: <5lwvubixh8.fsf@tequila.cs.yale.edu> X-Newsreader: Gnus v5.7/Emacs 20.4 Path: tequila.cs.yale.edu NNTP-Posting-Host: tequila.cs.yale.edu X-Trace: 31 Aug 1999 15:03:31 -0500, tequila.cs.yale.edu >>>>> "John" == John Skaller writes: > When I write ocaml, I often do the following to get brackets right: > I put the brackets in first: > print_endline () > print_endline (x ^ ()) > print_endline (x ^ (string_of_int x)) > because I cannot count :-) This is a pain, because I have to > keep backspacing. Even worse is: I have a string, Emacs is your friend. It will count the parens for you and you can use Meta-( to introduce a pair of parens (putting the cursor in the middle). > The second problem I have is with the constructions that > are like 'prefix/infix' operators, for example > if .. then .. else ... > try .. with ... > match .. with | .. -> .. | .. -> .. > Sudies were done in the 70's showing this is not as readable as > constructions bounded lexically at both ends. I don't know about studies, but as the maintainer of the SML mode for Emacs I totally agree: it's just a pain the rear. > A general rule for a good syntax would be that augmentation > of some term of a construction only required local editing. > This means: > terminators, not separators > mandatory begin/end keywords Caml (like SML and Pascal and C and ...) has taken the point of view that begin/end entities should not be made mandatory if they are unambiguously unneeded. I can only agree with that point of view: why should I say if a then (1) else (2) ? Of course, it leads to subtle problems when you change one of the arms without first adding the delimiters, but then the indentation of your editor might help you. > defensively: I put the brackets in to be sure of the semantics. > This is useful for readers who are also not experts in the > language as well. You could also try to rely on your programming environment to help you. My latest SML mode (sorry, but I happen to use SML rather than O'Caml. Hopefully the Emacs support modes for the two languages can be somewhat merged at some point, given the amount of similarity) for example (maybe caml-mode does the same) tries to allow the user to jump over expressions in a precedence-aware way. Once you get used to the way it works, you can use it to check what goes to verify your understanding of precedence (I also always get it wrong). > (fun x -> print_endline ..) > is ugly compared to: > begin fun x -> print_endline .. end Aesthetics is in the eye of the beholder. It's much harder to visually match `begin' to `end' than ( to ). And similarly, it's harder for your text editor to match them (Emacs for example has excellent built-in support for matching parenthesis, but lousy support for matching keywords). > but the ideal would be > fun x is print_endline .. efun Plop! Yet another reserved keyword! Syntax is one of those things that you just can't get right. Stefan