[MLton] 2004 bug reports

Tom Murphy tom7@cs.cmu.edu
Sat, 17 Jan 2004 16:11:58 -0500 (EST)


Thanks for your help getting mlton-2004 compiled on my machine. I like
the new mlton a lot! It's great to not have to support both mlton and
SML/NJ for type-checking (especially since they are so slow about
fixing bugs), and the error messages are really great. I found a bunch
of bugs and things you might want to know about.


I had to change the #!interpreter in the 'mlton' script to invoke bash2
instead of my old bash, otherwise I get this error:

[root@spacebar /root]# mlton @MLton gc-summary -- test.sml
/usr/local/bin/mlton: [: --: unary operator expected
@MLton missing --

(This also causes bootstrapping to fail.)


I tried compiling ConCert with mlton after updating it for the 2002 basis
spec.

    fun localhost () =
        let
            val sys_gethostname = _ffi "gethostname" :
                CharArray.array * int -> int ;
            val buf = Unsafe.CharArray.create 512
        in
            sys_gethostname (buf, 511)
        end


Error: raw-network.sml 63.18: function applied to incorrect argument
   expects: [CharArray.array] * _
   but got: [Unsafe.CharArray.array] * _
   in: sys_gethostname (buf, 511)


The UNSAFE sig on the mlton page seems to indicate that these should be
the same type. (It would be nice if the UNSAFE_* sigs were included in the
user guide; I don't know where else to find those.) Certainly Unsafe is
pretty useless if the types are different.


I realize that the basis 1997 is now deprecated, but in that mode,
LargeWord.toString apparently expects Word64.word even though the
Word64 structure is not bound:

Warning: -basis is deprecated
Error: compile.sml 54.17: function applied to incorrect argument
   expects: [Word64.word]
   but got: [word]
   in: LargeWord.toString (Posix.Process.p  ...  Posix.ProcEnv.getpid ()))

(changed to Word64.toString)

Warning: -basis is deprecated
Error: compile.sml 54.17: undefined structure Word64



I ran mlton on some of the TILT tests. Here's some bugs with the parser:

The lex item after infix(r) should be DIGIT, not INT.
mlton accepts, but should reject:

infix 00 x
infix ~0 x

infix 0x0 l

... ditto with infixr.


mlton should all of the one-liners below. See the def'n page 12:

        "No datdesc, valdesc, or exdesc may describe true, false,
         nil, ::, or ref."


val rec op :: = fn x => x

val rec nil = fn x => x

val rec true = fn x => x

val rec ref = fn x => x


mlton is not good at detecting duplicates, except for pattern variables.
It should reject these:

datatype ('a, 'a) a = A

datatype a = A | A

fun f x = x
and f x = x


datatype t = A
and t = B

val x = { a = 1, a = 1 }

val x = 1
and x = 2

type x = int
and x = int

exception X and X



Cheers,

  Tom