Ответ 1
Точки с запятой используются для нескольких синтаксических объектов в SML. Обычно они используются для создания последовательностей, например, выражений или деклараций. Здесь ссылка на грамматику SML:
http://www.mpi-sws.org/~rossberg/sml.html
В вашем случае вас интересует точка с запятой для деклараций (класс dec). Обратите внимание, что точка с запятой, которая создает последовательность делений, является необязательной. Вы никогда не нуждаетесь в этом при написании модулей SML, и их редко встречают. Например
structure S = struct
val x = 5
fun f x = x
val z = x + x
end
не
structure S = struct
val x = 5;
fun f x = x;
val z = x + x
end
В исходном файле единственное место, где вы обычно используете точку с запятой, - это разделение выражений, которые имеют побочные эффекты. Например,
val x = ref 5
val _ = (x := !x + 1; x := !x+ 2)
но это использование встречается редко.
smlnj repl оценивает объявления только тогда, когда видит точку с запятой, поэтому вы должны использовать точку с запятой, когда хотите увидеть или сыграть со значением. Я думаю, что случай use "foo.sml";
запутан, потому что это не декларация; это выражение. Я полагаю, что repl преобразует выражения типа use "foo.sml"
в val _ = use "foo.sml"
. Таким образом, ему нужна точка с запятой, чтобы сказать, что repl действительно запускает ее, как указано выше. Как примечание, нет ничего особенного в use
. Это просто функция типа string -> unit
.