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

_______________________________________________
polyml mailing list
[email protected]
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml

Reply via email to