Когда использовать точки с запятой в SML?

Я знаю, что точки с запятой используются в качестве терминаторов в REPL. Но я смущен, когда их использовать в исходном файле.

Например, это необязательно после val x = 1. Но если я опустил его после use "foo.sml", компилятор будет жаловаться на него.

Затем, каковы правила использования точек с запятой?

Ответ 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.