15

我知道分号在 REPL 中用作终止符。但我对何时在源文件中使用它们感到困惑。

例如,在 之后就没有必要了val x = 1。但是如果我在 之后省略它use "foo.sml",编译器会抱怨它。

那么,分号的使用规则是什么?

4

1 回答 1

12

分号用于 SML 中的许多句法实体。它们通常用于创建例如表达式或声明的序列。这是 SML 语法的链接:

http://www.mpi-sws.org/~rossberg/sml.html

在您的情况下,您对声明的分号(dec类)感兴趣。请注意,创建 decs 序列的分号是可选的。在编写 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。它只是 type 的一个函数string -> unit

于 2013-10-08T03:06:16.757 回答