[MLton] Question about Definition of SML :)

Anoq of the Sun anoq@HardcoreProcessing.com
Tue, 09 Dec 2003 16:24:35 +0200

Stephen Weeks wrote:
> Actually that was my point :-) (and Andreas didn't like it).

OK - then I guess the quoting of who wrote what was confusing to me :)

> I can't
> quite see how I would formalize such a rule in the definition, though.

The way I would do it is to require each and every closure operation
to do a complete closure without allowing any free type variables.
This has been my (wrong) understanding of the closure operation all along.
Then I also require the value-restriction on each and every local
closure operation.

> Will you accept or reject
>         val x = ref nil

I will reject it - due to value-restriction (and the truly "closing closure").

> If you reject this based on some local rule, you must presumably also
> reject
>         val x = ref nil
>         val _ = 1 :: !x
> and
>         val _ =
>            let
>               val x = ref nil
>               val _ = 1 :: !x
>            in
>               ()
>            end

Yes, I would reject them all. As far as I know I have never written
any program SML myself where I have had a ref nil or ref NONE or similar
without also having a type constraint or that it was because of a polymorphic
parameter of a function.

So I would accept for instance:

fun f a =
        val v = ref [a]

Because a is scoped at the outer val-binding (fun).

> It sounds nice in principle, but in practice the problem is that a
> top-level declaration has an open-ended scope including the rest of
> the program.

Yes - I would also reduce the scope here to be just at each val binding.

But I would accept the following both at top-level and locally:

val rec x = ref nil
and     _ = 1 :: !x

Because of rec + and.

> Maybe.  I tend not to mind type constraintgs too.  I agree it would
> certainly be an interesting experiment to have a more constrained rule
> and see what happens.  Perhaps you would like to write one in MLton
> and try some real programs to see how many break?

I would actually very much like to try that as an experiment! Very good idea :)
But I believe I won't have time for this before the deadline of my project (19. dec).
So I guess I won't have time to use such feedback to influence my semantics before
I release it - but at least the semantics seems to just be more restrictive.
"Losening up" later on should not cause any incompatibilities (as it seems to me?).

> I mean to say that this program must be accepted.  And in fact all
> implementations accept it.  And I have never heard an argument that it
> may be rejected.

OK :)