[MLton-user] Order of evaluation of arguments to a function

Ivan Tomac ivan.tomac at gmail.com
Thu Aug 18 07:06:04 PDT 2011


Is the following code supposed to print 1 followed by 2 or 2 followed by 1?

val _ = (fn () => (print "1\n"; fn x => x)) () (print "2\n"; ())

In SML/NJ, MLton and PolyML it does the former, while in Moscow ML it
does the latter. Is this specified somewhere in the standard? I
noticed equivalent code in OCaml behaves the way Moscow ML does which
is not very surprising seeing how Moscow ML was based on Caml Light.
Could this be a bug in Moscow ML?

The following code works the same in all 4 SML compilers (but
different in OCaml):

val _ = (print "1\n"; 1) + (print "2\n"; 2)

It seems to me like SML/NJ, MLton and PolyML evaluate all function
arguments left to right, OCaml evaluates them right to left, and
Moscow ML seems inconsistent.



More information about the MLton-user mailing list