何时在SML中使用分号?

何时在SML中使用分号?,sml,smlnj,ml,Sml,Smlnj,Ml,我知道分号在REPL中用作终止符。但我不知道什么时候在源文件中使用它们 例如,在val x=1之后不需要。但是如果我在使用“foo.sml”之后省略了它,编译器会抱怨它 那么,使用分号的规则是什么呢?分号用于SML中的许多语法实体。它们通常用于创建表达式或声明等序列。以下是SML语法的链接: 在您的例子中,您对声明的分号(dec类)感兴趣。请注意,创建DEC序列的分号是可选的。在编写SML模块时,您从来都不需要它,而且很少看到它们。比如说 structure S = struct val

我知道分号在REPL中用作终止符。但我不知道什么时候在源文件中使用它们

例如,在
val x=1
之后不需要。但是如果我在
使用“foo.sml”
之后省略了它,编译器会抱怨它


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

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

在您的例子中,您对声明的分号(dec类)感兴趣。请注意,创建DEC序列的分号是可选的。在编写SML模块时,您从来都不需要它,而且很少看到它们。比如说

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仅在看到分号时才计算声明,因此您应该在希望看到或处理该值时使用分号。我认为
使用“foo.sml”大小写比较混乱,因为它不是一个声明;这是一个表达。我想repl会将
use“foo.sml”
这样的表达式转换为
val\uz=use“foo.sml”
。因此,它需要分号来告诉repl真正运行它,如上所述。作为旁注,
使用
没有什么特别之处。它只是一个类型为
string->unit
的函数

谢谢。现在我知道为什么在声明中不需要它了。然后请您解释一下为什么在
中需要使用“foo.sml”?我还是不明白。谢谢你的澄清。这是否意味着在源文件(不是REPL)中,如果我在一行中编写表达式,如
1+1
,我必须用分号终止它?是的,除非您希望表达式继续到下一行,例如
1\n+\n 1
根据经验,如果希望查看结果,请在repl中使用分号。
val x = ref 5
val _ = (x := !x + 1; x := !x+ 2)