Browse thread
[Caml-list] semi-colons and begin
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2001-04-05 (17:43) |
From: | Gerd Stolpmann <gerd@g...> |
Subject: | Re: [Caml-list] semi-colons and begin |
On Wed, 04 Apr 2001, Chris Hecker wrote: >I must admit I'm still slightly confused about the semicolon thing, even after writing a fair amount of caml code. The current sticking point is that > ># if false then print_int 2; print_int 3;; >3- : unit = () > ># if false then print_int 2; print_int 3 else ();; >Characters 39-43: >Syntax error ># > ># if false then begin print_int 2; print_int 3 end;; >- : unit = () ># if false then begin print_int 2; print_int 3 end else ();; >- : unit = () > >The "BNF" grammar implies the first and second tests should compile and print nothing, >since expr = expr ; expr, although Xavier et al. have said the BNF in the docs >isn't really accurate. The BNF is ambigous (as most grammars). So you can't say which is the right way to set the parentheses: (if false then print_int 2); print_int 3 -- OR if false then (print_int 2; print_int 3) Both ways are correct if you only look at the grammar. However, in the O'Caml manual there is a precedence table (section 6.7) determining that "if" has higher precedence than ";". So the first way is what the compiler interprets. > >also thought begin...end was needed in a >pattern-match, but apparently expr ; expr works there? In the precedence table "match" has lower precedence than ";". >Is there a chart or something that says exactly where they're allowed? I'm >afraid of introducing a subtle bug in my program. In C I always use brackets >with my if statements to avoid the similar problem, so I suppose I could use >begin..end everywhere, but yuck! You can use begin ... end (or (...) which is the same) everywhere in expressions. But I don't recommend it because it makes code unreadable which is another cause for errors. I personally have no problems with "if" because it is in the same style as in the first structured programming language I've learned (Pascal). If you have problems I would recommend to use Emacs as editor with one of the two O'Caml modes. It automatically indents the code, so you see: if false then print_int 2; print_int 3 and _not_ if false then print_int 2; print_int 3 which would mean that you did it wrong. Gerd -- ---------------------------------------------------------------------------- Gerd Stolpmann Telefon: +49 6151 997705 (privat) Viktoriastr. 100 64293 Darmstadt EMail: gerd@gerd-stolpmann.de Germany ---------------------------------------------------------------------------- ------------------- To unsubscribe, mail caml-list-request@inria.fr. Archives: http://caml.inria.fr