On 29/03/2012 16:00, Rob Arthan wrote:
On 27 Mar 2012, at 22:41, Phil Clayton wrote:
For example, given
infix& datatype t =&
Poly/ML (5.4) reports:
Warning-(&) has infix status but was not preceded by op.
So Poly/ML seems to prefer the use of 'op' in a datatype declaration. However, if 'op' is present, i.e.
I've had another look at this and committed a change to the parser. I can't see any reason for producing the warning in this case so I've removed it. I have a vague feeling that in an early draft of Standard ML the syntax of datatype bindings more closely resembled pattern matching so there was a real reason for using "op". Something like datatype 'a list = nil | 'a :: 'a list compared with datatype 'a list = nil | op :: 'a * 'a list
Looking carefully at the syntax, though, "op" is not allowed in a datatype specification although in all other respects the syntax of a binding and a specification are the same. I've added an error message if "op" is used in a specification.
Can anything be done to align the warnings from Poly/ML and SML/NJ in this respect?
It is, of course, possible to write local nonfix & in datatype t = & end This should work in both Poly/ML and SML/NJ although I haven't tested SML/NJ here.
(f&);
Error-<identifier> expected but ) was found
I would have expected Poly/ML to give a warning on the exception binding. I also can't explain why it doesn't allow (f&). Maybe David can give a more accurate explanation of when Poly/ML requires op.
I hadn't actually realised that "op" was allowed on exception bindings and I've now fixed that. I think a sensible approach is to produce a warning in the cases where a symbol could be used as an infix; in an expression, a fun binding or in a pattern (val binding) and to ignore it in other cases.
The reason that "f &" gives an error is that here we have something that could actually be an infixed use of "&" but isn't because the right-hand side is missing. I think it's actually more helpful than producing a warning. For example, val a = 1; val b = a + ; is probably a missing expression. Producing a warning about a missing "op" and then an error saying "a" is not a function could well be more confusing than helpful.
David