A record expression is evaluated as follows.
First, it is checked whether all of its labels are distinct.
If not, a type error occurs.
Second,
each expression ⟨expi⟩ is evaluated to a
type ⟨tyi⟩ and value vi in
the order of their occurrences in the record expression.
Finally, they are sorted in the order of label strings and
constitutes a record type
{⟨lab1′⟩ : ⟨ty1′⟩, …, ⟨labn′⟩ : ⟨tyn′⟩}
and record value
{⟨lab1′⟩ = v1′, …, ⟨labn′⟩ = vn′}
as the type and value of the record expression.
Therefore, for example, when
val x = {SML = (print "SML#";"SML#"),
IS = (print " is ";" is "),
SHARP = (print " sharp!\
n";" sharp!\
n")}
is evaluated,
it prints "SML# is sharp!" and then
x is bound to the type and value like the following
val x = {IS = " is ", SHARP = " sharp!\
n", SML = "SML#"} : {IS: string, SHARP: string, SML: string}