在SML中何时使用分号?

17
我知道在REPL中分号被用作终止符。但是我对于在源文件中何时使用它们感到困惑。
例如,在val x = 1后面不需要使用分号。但是如果我在use "foo.sml"后省略它,编译器将抱怨。
那么,在使用分号方面有什么规则呢?
1个回答

14

在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并没有什么特别之处,它只是一个类型为string -> unit的函数。


谢谢。现在我知道为什么在声明中不是必需的了。那么你能解释一下为什么在 use "foo.sml"; 中需要吗?我还是不理解。 - Ben
谢谢您的澄清。这是否意味着在源文件(而非REPL)中,如果我将表达式写成单行形式,例如 1+1,我必须以分号结尾? - Ben
是的,除非你想让表达式继续到下一行,比如 1\n +\n 1;。作为一个经验法则,在 repl 中想要查看结果时使用分号。 - seanmcl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接