我知道分号在 REPL 中用作终止符。但我对何时在源文件中使用它们感到困惑。
例如,在 之后就没有必要了val x = 1
。但是如果我在 之后省略它use "foo.sml"
,编译器会抱怨它。
那么,分号的使用规则是什么?
分号用于 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
。