So I was reading http://www.podval.org/~sds/ocaml-sucks.html, which includes this quote (in the context of problems with ocaml):
there are actually three mildly different syntaxes:
- the official one is described in the manual
- a superset thereof is accepted by the compiler ocamlc
- something similar (but ever so slightly different) is accepted by the preprocessor Camlp4 (e.g., it accepts List.map [1;2;3] ~f:fun x -> x, which is also accepted by the top-level, but not the compiler)
What are examples of ocaml code fragments that are accepted by the ocamlc but do not match the manual?
PS - I'm mainly interested in OCaml 4.00.1, but previous versions are also interesting...
One funny example, in the interest of curiosity only:
OCaml version 4.00.0
# type 'a weird_list =
| ()
| :: of 'a * 'a weird_list;;
type 'a weird_list = () | :: of 'a * 'a weird_list
# 1::2::3::();;
- : int weird_list = :: (1, :: (2, :: (3, ())))
The differences between Camlp4 and the OCaml compiler are sometimes bugs, but most often explained by the difference in parser technology: if you write an idiomatic LR parser and a LL parser for the same language with mildly annoying syntax subtleties, you should not expect both to match perfectly. I don't think this is a problem in practice (but in practice most people don't use Camlp4).